⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 如何用vc++和vfp进行activex数据通讯.txt

📁 C&C++论坛精华
💻 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 + -