如何用VC++和Visual Foxpro进行ActiveX数据通讯
【打印文章】
作者:粟利民 孙强
摘要 本文描述了如何利用自动服务器 Active Automation,在VC++
中与Visual Foxpro 进行数据通讯的方法。通过自动服务器,圆满地解决
了各种数据类型的交换问题。
关键词 VC++,Visual Foxpro,ActiveX Automation,数据通讯。
在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通
讯,需要进行不断的探索和总结。我们在开发机械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");
}
上面讲述在VC++中如何与Visual Foxpro 进行整型和双精度型变量的
数据通讯的方法。通过查看tagVARIANT结构的帮助文件,可以看到其中有
一个成员为VARTYPE vt。可以说vt是非常重要的,在VC++中读取Foxpro中
的数据后,vt 的值就决定了其数据的类型。在上例中,mypara1.vt等于3
而mypara2.vt等于5,表示它们的数据类型分别为整型和双精度型。在VC++
中也可根据tagVARIANT变量的vt值来判断所读取的数据的确切类型。我们
还可以看到,不同类型的数据,在VC++中的访问方式也有所不同。如整型
用 iVal,而双精度型用 dblVal,上例中分别为mypara1.iVal和mypara2.
dblVal。
摘要 本文描述了如何利用自动服务器 Active Automation,在VC++
中与Visual Foxpro 进行数据通讯的方法。通过自动服务器,圆满地解决
了各种数据类型的交换问题。
关键词 VC++,Visual Foxpro,ActiveX Automation,数据通讯。
在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通
讯,需要进行不断的探索和总结。我们在开发机械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");
}
上面讲述在VC++中如何与Visual Foxpro 进行整型和双精度型变量的
数据通讯的方法。通过查看tagVARIANT结构的帮助文件,可以看到其中有
一个成员为VARTYPE vt。可以说vt是非常重要的,在VC++中读取Foxpro中
的数据后,vt 的值就决定了其数据的类型。在上例中,mypara1.vt等于3
而mypara2.vt等于5,表示它们的数据类型分别为整型和双精度型。在VC++
中也可根据tagVARIANT变量的vt值来判断所读取的数据的确切类型。我们
还可以看到,不同类型的数据,在VC++中的访问方式也有所不同。如整型
用 iVal,而双精度型用 dblVal,上例中分别为mypara1.iVal和mypara2.
dblVal。
本栏文章均来自于互联网,版权归原作者和各发布网站所有,本站收集这些文章仅供学习参考之用。任何人都不能将这些文章用于商业或者其他目的。( Pfan.cn )
【编程爱好者论坛】