分享
 
 
 

如何用VC++和VFP进行ActiveX数据通讯

王朝vc·作者佚名  2006-01-08
窄屏简体版  字體: |||超大  

在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通讯,需要进行不断的探索和总结。我们在开发机械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。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有