?? 如何用vc++和vfp進行activex數據通訊.txt
字號:
作者:SKYHORSEBJ
email: XUEY@CIDC.COM.CN
日期:2001-7-4 17:31:33
在進行軟件開發的過程中,如何在不同的編程工具之間進行數據交換和通訊,需要進行不斷的探索和總結。我們在開發機械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中創建自動服務器
---- 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. 將上述程序聯編為可執行程序(如MyServer.exe)
---- 選中程序MyServer,點擊“連編”按鈕,選擇“連編可執行程序”選項,并按確定,便可生成可執行程序。
---- 二.在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”對話框中找到剛才所創建的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");
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -