精选文章 如何用VC++和Visual Foxpro进行ActiveX数据通讯

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

作者:蝈蝈俊 时间: 2021-02-07 03:20:14
蝈蝈俊 2021-02-07 03:20:14
【摘要】如何用VC++和Visual Foxpro进行ActiveX数据通讯 粟利民 孙强 摘要 本文描述了如何利用自动服务器Active Automation,在VC++中与Visual Foxpro进行数据通讯的方法。通过自动服务器,圆满地解决了各种数据类型的交换问题。 关键词 VC++,Visual Foxpro,ActiveX Automation,数据通讯 在进行软件开发的过程中,如何在不...

如何用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。

以上是我们软件开发小组在实际编程中总结出的数据通讯的方法,有关其他类型如字符串的数据传递则比较复杂些。鉴于篇幅的问题,在此我们不再一一陈述,有兴趣的同行和朋友可与我们联系,共同探讨和交流编程的心得和方法技巧。

 

勿删,copyright占位
您找到想要的结果了吗?
如何用VC++和Visual Foxpro进行ActiveX数据通讯
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:使用MFC编写internet查询程序

下一篇:Digital Unix Version 4.0下Oracle 8.0.5服务器的安装

您可能感兴趣

  • 通过弯曲光线来进行AI分析 这款机器学习系统与3D打印完美融合

    如今机器学习系统到处都是,但它或多或少是隐形的。它隐藏在后台优化音频,或在图像中识别人脸。但这个新系统不仅是可见的,而且是物理的。它不是通过计算数字,而是通过弯曲光线来进行AI型分析。它怪异且独特,但和人们的第一感觉恰恰相反,它反而很好地证明了这些“人工智能”系统是多么的简单。 机器学习系统,我们常把它称作人工智能的一种形式,其核心是一系列基于数据...

  • 如何利用Visual Studio建立具有MVC框架的网页模型

    如何利用Visual Studio建立具有MVC框架的网页模型 1.打开VS2015,新建项目,选择Web模型中的ASP.NET Web应用程序 2.其次选择带有MVC的模板进行创建,并等待项目创建成功 ...

  • pandas中对列进行上下平移(shift)

    在利用Python进行数据操作时,有时需要对数据某列数据进行上下平移,比如对某一列进行错位加减,pandas里的groupby和shift两个函数就能轻松实现上述操作。 df = pd.DataFrame({"nam...

  • VC++ Tab Control控件的使用

    网上介绍使用Tab Control控件,好像说的都不是很详细, 我一小菜这边随便说说, 见笑. 1. 新建一个MFC工程, 取名MyTab, 选择Dialog based, 然后Finish. 2. 删除对话框上默认添加的三个控件. 添加Tab Control控件并在Property属性中设置ID为IDC_TABTEST 在More Styl...

  • [AS3]单个图片进行角色动作化处理【转】

    转至:http://www.klstudio.com/post/119.html package {    import flash.display.*;    import flash.net.*;    import flash.utils.Timer;    import flash.events.*;    import flash.g...

  • VC++学习 windows 消息

         windows 是一个非优先式多任务操作系统,它是通过消息(Message)来对多任务进行管理。外设输入设备如果键盘、鼠标等的动作都是经过驱动转 换为消息,交给windows进行处理,将消息放入系统消息队列中。      每个程序在windows上开始运行时,windows都会为其创建一个应用程序消息队列(Applicatio...

  • 五、Jmeter-数据库数据进行参数化

    一、测试计划加载mysql驱动(官网下载mysql-connector-java-5.1.44-bin.jar后放置lib目录下)          二、添加配置元件-JDBC Connection Configuration(配置数据库连接信息)    三、添加Sampler-JDBC Request(查询)    ...

  • 对时间进行排序

     //排序 对时间进行排序   NSMutableArray *dataArray=[[NSMutableArray alloc]initWithCapacity:0];    NSMutableDictionary *dir=[[NSMutableDictionary alloc]init];    [dir setObject:@"2...

CSDN

CSDN

中国开发者社区CSDN (Chinese Software Developer Network) 创立于1999年,致力为中国开发者提供知识传播、在线学习、职业发展等全生命周期服务。
如何用VC++和Visual Foxpro进行ActiveX数据通讯介绍:华为云为您免费提供如何用VC++和Visual Foxpro进行ActiveX数据通讯在博客、论坛、帮助中心等栏目的相关文章,同时还可以通过 站内搜索 查询更多如何用VC++和Visual Foxpro进行ActiveX数据通讯的相关内容。| 移动地址: 如何用VC++和Visual Foxpro进行ActiveX数据通讯 | 写博客