?? 如何用vc++和vfp進行activex數(shù)據(jù)通訊.txt
字號:
作者:SKYHORSEBJ
email: XUEY@CIDC.COM.CN
日期:2001-7-4 17:31:33
在進行軟件開發(fā)的過程中,如何在不同的編程工具之間進行數(shù)據(jù)交換和通訊,需要進行不斷的探索和總結(jié)。我們在開發(fā)機械CAD仿真軟件的過程中,遇到了在VC++中讀取和修改Visual Foxpro中數(shù)據(jù)的問題。經(jīng)過許多次的試驗,我們通過采用自動服務(wù)器(ActiveX Automation)的方法圓滿解決了這個問題。
---- 自動服務(wù)器,以前稱為OLE Automation,后來稱為ActiveX OLE Automation,就是編寫能被其他程序調(diào)用的代碼。其他程序不是以DLL的孤立方式而是直接調(diào)用自動服務(wù)器的用戶代碼。這其中比較難理解的概念是:自動服務(wù)器用戶代碼向其他應(yīng)用程序揭示了屬性(變量)和方法(函數(shù))。以下將以整型和雙精度(對浮點型同樣適用)的數(shù)據(jù)傳遞為例,講述如何用ActiveX Automation在VC++和Visual Foxpro之間進行數(shù)據(jù)通訊,例子中的編程工具為VC++ 5.0和Visual Foxpro 5.0。
---- 一.在Visual Foxpro中創(chuàng)建自動服務(wù)器
---- 1. 在Visual Foxpro中定義服務(wù)器類(此例中為CDATA類)首先在某目錄下新建一工程,在工程管理器中選擇代碼欄,同一目錄下新建一程序(如MyServer.prg),并在此程序文件中定義服務(wù)器類。
*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. 將上述程序聯(lián)編為可執(zhí)行程序(如MyServer.exe)
---- 選中程序MyServer,點擊“連編”按鈕,選擇“連編可執(zhí)行程序”選項,并按確定,便可生成可執(zhí)行程序。
---- 二.在VC++中對自動服務(wù)器進行測試
---- 1.關(guān)閉Visual Foxpro,在VC++中選擇菜單項“File-New”,再選擇“Projects”中的“MFC AppWizard (exe)”選項,隨后按默認(rèn)方式生成“Dialog Based”的工程項目(此例中工程名為MyTest)。
---- 2.在MyTest.cpp中的APP類的InitInstance()函數(shù)開頭加入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按鈕加以確認(rèn),將自動在項目中加入與CDATA類有關(guān)的文件MyServer.cpp和MyServer.h。在ClassView中可查看CDATA類的函數(shù),如GetPara1()、SetPara1()和CHANGEDATA()等。這里要注意類名CDATA和函數(shù)名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()函數(shù)中)加入
m_data.CreateDispatch(“MyServer.CDATA);
---- 6.使用自動服務(wù)器的通訊編程
---- 此例中,我們在對話框中設(shè)置一命令按鈕“Test”,通過點擊該按鈕來對自動服務(wù)器進行測試。
void CMyTestDlg::OnButtonTest()
{
//首先利用CDATA類的GetPara1()
等取值函數(shù)取出Foxpro中的變量值,
//再利用CDATA類SetPara1()
等賦值函數(shù)來修改Foxpro中的這些變量值
//也可以在VC++中調(diào)用CDATA
類的函數(shù)CHANGEDATA()來修改變量值
//定義tagVARIANT型變量,
請參看有關(guān)tagVARINAT的幫助
tagVARIANT mypara1, mypara2;
mypara1=m_data.GetPara1();
//讀取Foxpro中的變量值para1
mypara2=m_data.GetPara2();
//讀取Foxpro中的變量值para2
//檢驗讀取數(shù)據(jù)是否正確(Foxpro設(shè)定為123和123.123)
if(mypara1.iVal==123)
MessageBox("mypara1.iVal=123");
if(mypara2.dblVal==123.123)
MessageBox("mypara2.dblVal=123.123");
//修改這些變量值(也可用調(diào)用
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();
//檢驗修改數(shù)據(jù)是否正確(應(yīng)改為246和246.246)
if(mypara1.iVal==246)
MessageBox("mypara1.iVal=246");
if(mypara2.dblVal==246.246)
MessageBox("mypara2.dblVal=246.246");
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -