怎么用VC++與Visual Foxpro進行ActiveX數據通訊
發(fā)表時間:2023-08-20 來源:明輝站整理相關軟件相關文章人氣:
[摘要]作者:粟利民 孫強 摘要 本文描述了如何利用自動服務器 Active Automation,在VC++ 中與Visual Foxpro 進行數據通訊的方法。通過自動服務器,圓滿地解決 了各種數據...
作者:粟利民 孫強
摘要 本文描述了如何利用自動服務器 Active Automation,在VC++
中與Visual Foxpro 進行數據通訊的方法。通過自動服務器,圓滿地解決
了各種數據類型的交換問題。
關鍵詞 VC++,Visual Foxpro,ActiveX Automation,數據通訊。
在進行軟件開發(fā)的過程中,如何在不同的編程工具之間進行數據交換和通
訊,需要進行不斷的探索和總結。我們在開發(fā)機械CAD仿真軟件的過程中,
遇到了在VC++中讀取和修改Visual Foxpro 中數據的問題。經過許多次的
試驗,我們通過采用自動服務器(ActiveX Automation)的方法圓滿解決
了這個問題。
自動服務器, 以前稱為 OLE Automation, 后來稱為 ActiveX OLE
Automation, 就是編寫能被其他程序調用的代碼。其他程序不是以DLL的
孤立方式而是直接調用自動服務器的用戶代碼。這其中比較難理解的概念
是:自動服務器用戶代碼向其他應用程序揭示了屬性(變量)和方法(函
數)。
以下將以整型和雙精度(對浮點型同樣適用)的數據傳遞為例,講述
如何用ActiveX Automation在VC++和Visual Foxpro 之間進行數據通訊,
例子中的編程工具為VC++ 5.0和Visual Foxpro 5.0。
一.在Visual Foxpro中創(chuàng)建自動服務器
1.在Visual Foxpro中定義服務器類(此例中為CDATA類)
首先在某目錄下新建一工程,在工程管理器中選擇代碼欄,同一目錄
下新建一程序(如MyServer.prg),并在此程序文件中定義服務器類。
*File Name: MyServer.prg
DEFINE CLASS CData AS Custom OLEPUBLIC
*對VC++而言, para1為整型, para2為double型
para1=123
para2=123.123
PROCEDURE ChangeData
this.para1=this.para1*2
this.para2=this.para2*2
RETURN
ENDPROC
ENDDEFINE
2.將上述程序聯編為可執(zhí)行程序(如MyServer.exe)
選中程序MyServer,點擊“連編”按鈕,選擇“連編可執(zhí)行程序”選
項,并按確定,便可生成可執(zhí)行程序。
二.在VC++中對自動服務器進行測試
1.關閉Visual Foxpro,在VC++中選擇菜單項“File-New”,再選擇
“Projects”中的“MFC AppWizard (exe)” 選項,隨后按默認方式生成
“Dialog Based”的工程項目(此例中工程名為MyTest)。
2.在MyTest.cpp中的APP類的InitInstance()函數開頭加入OLE使能。
BOOL CMyTestApp::InitInstance()
{
BOOL OleEnable=AfxOleInit();
if(!OleEnable) return FALSE;
……
}
3.在ClassWizard中選“Automation”中的“Add Class-From a type
library”。在“ Import from type library”對話框中找到剛才所創(chuàng)建
的Visual Foxpro工程目錄下的tlb文件(如MyServer.tlb)并選擇“打開”
按鈕,會有提示說明將要從Lib中生成CDATA類,點擊OK按鈕加以確認,將
自動在項目中加入與CDATA類有關的文件MyServer.cpp 和MyServer.h。在
ClassView 中可查看 CDATA 類的函數,如 GetPara1()、 SetPara1() 和
CHANGEDATA()等。這里要注意類名CDATA和函數名CHANGEDATA() 的大小寫
請參看具體的頭文件MyServer.h。
4.在對話框類(此例中為CMyTestDlg)的頭文件MyTestDlg.h的開頭
部分,將CDATA類的頭文件MyServer.h包含進來。隨后定義CDATA類的實例
m_data作為對話框類的成員變量。
// MyTestDlg.h : header file
#include "myserver.h"
……
class CMyTestDlg : public CDialog
{
// Construction
public:
CMyTestDlg(CWnd* pParent = NULL); // standard constructor
private:
CDATA m_data; //定義CDATA類的實例m_data
……
}
……
5.在對話框的初始化部分(如InitDialog()函數中)加入
m_data.CreateDispatch(“MyServer.CDATA);
6.使用自動服務器的通訊編程
此例中,我們在對話框中設置一命令按鈕“Test”,通過點擊該按鈕
來對自動服務器進行測試。
void CMyTestDlg::OnButtonTest()
{
//首先利用CDATA類的GetPara1()等取值函數取出Foxpro中的變量值,
//再利用CDATA類SetPara1()等賦值函數來修改Foxpro中的這些變量值
//也可以在VC++中調用CDATA類的函數CHANGEDATA()來修改變量值
//定義tagVARIANT型變量,請參看有關tagVARINAT的幫助
tagVARIANT mypara1, mypara2;
mypara1=m_data.GetPara1(); //讀取Foxpro中的變量值para1
mypara2=m_data.GetPara2(); //讀取Foxpro中的變量值para2
//檢驗讀取數據是否正確(Foxpro設定為123和123.123)
if(mypara1.iVal==123)
MessageBox("mypara1.iVal=123");
if(mypara2.dblVal==123.123)
MessageBox("mypara2.dblVal=123.123");
//修改這些變量值(也可用調用CHANGEDATA()的方式來修改變量值)
mypara1.iVal=mypara1.iVal*2; //整型變量乘以2
mypara2.dblVal=mypara2.dblVal*2.0; //double型變量也乘以2
m_data.SetPara1(mypara1); //向Foxpro賦值
m_data.SetPara2(mypara2);
//再次讀取Foxpro中的變量值
mypara1=m_data.GetPara1();
mypara2=m_data.GetPara2();
//檢驗修改數據是否正確(應改為246和246.246)
if(mypara1.iVal==246)
MessageBox("mypara1.iVal=246");
if(mypara2.dblVal==246.246)
MessageBox("mypara2.dblVal=246.246");
}
上面講述在VC++中如何與Visual Foxpro 進行整型和雙精度型變量的
數據通訊的方法。通過查看tagVARIANT結構的幫助文件,可以看到其中有
一個成員為VARTYPE vt?梢哉fvt是非常重要的,在VC++中讀取Foxpro中
的數據后,vt 的值就決定了其數據的類型。在上例中,mypara1.vt等于3
而mypara2.vt等于5,表示它們的數據類型分別為整型和雙精度型。在VC++
中也可根據tagVARIANT變量的vt值來判斷所讀取的數據的確切類型。我們
還可以看到,不同類型的數據,在VC++中的訪問方式也有所不同。如整型
用 iVal,而雙精度型用 dblVal,上例中分別為mypara1.iVal和mypara2.
dblVal。