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

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

作者:ShowMan 时间: 2021-02-07 03:20:06
ShowMan 2021-02-07 03:20:06
【摘要】在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通讯,需要进行不断的探索和总结。我们在开发机械CAD仿真软件的过程中,遇到了在VC++中读取和修改Visual Foxpro中数据的问题。经过许多次的试验,我们通过采用自动服务器(ActiveX Automation)的方法圆满解决了这个问题。 
---- 自动服务器,以前称为OLE Automation,后来称为ActiveX ...
在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通讯,需要进行不断的探索和总结。我们在开发机械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++和VFP进行ActiveX数据通讯
提交成功!非常感谢您的反馈,我们会继续努力做到更好
分享文章到微博
分享文章到朋友圈

上一篇:SQL Server存储过程编程经验技巧

下一篇:在WIN95中实现文件拷贝的编程方法

您可能感兴趣

  • kettle 通过java脚本对数据进行标注

    在项目当中遇到一种情况:我需要根据不同字段的值综合判断该数据属于我划分的哪种类型。 如果是单个字段我们可以根据kettle提供的switch / case 组件进行判断并赋值,但是如果通过多个字段或者是添加某种限定条件对数据整体进行处理,该组件的功能不足以支持。这种时候我开始怀念以前用java进行数据清洗,内存崩了的时候。java为我们数据清洗提供...

  • R语言通过WinBUGS对MGARCH和MSV模型进行贝叶斯估计和比较

    原文链接:http://tecdat.cn/?p=5361 多变量广义自回归条件异方差(MGARCH)和多变量随机波动率(MSV)模型与马尔可夫链蒙特卡罗方法的贝叶斯估计和比较可以直接和成功地在WinBUGS包中进行。 经济全球化和金融市场的完整性促进了对资产定价,风险管理,投资组合选择等各个领域的多元波动建模的需求。因此,两种类型的模...

  • 如何用asp的jmail组件发邮件的应用

    如何用asp的jmail组件发邮件的应用 前一段时间有发过一个简单的JMAIL邮件发邮件的代码,今天就把这个代码做一个具体的注解,并增加了另外两个格式的代码,并举几个简单的例子: 首先是jmail.smtpmail的核心代码: <% Set jmail = Server.CreateObject("JMAIL.SMTPMail") '...

  • sql对同一个字段不同状态分别进行统计数量

    <!-- 统计供应商会员数量 -->      <select id="sel_deal_sum_data" parameterClass="java.util.Map" resultClass="com.forlink.fkcore.data.ResultMap">         SELECT             count(if(w.sel...

  • 使用Intent和Bundle进行跳转Activity传值SparseArray数据

    使用Intent和Bundle进行跳转Activity传值SparseArray数据 MainActivity.java import android.content.Intent; import android....

  • 【J2me3D系列学习文章之三】(立即模式)对立方体进行变换操作-旋转、缩放、平移...

    本文源地址:http://blog.csdn.net/xiaominghimi/archive/2010/12/09/6064367.aspx Himi 原创, 转载请注明! 谢谢。 上一篇文章讲述了如何构造一个简单的立方体,以及对立方体设定颜色,那么这一章学习对立方体进行变换操作。 对上一篇文章的学习中也强调了两个Tran...

  • 如何进行磁盘分区?

    作品展在大家的关注下已经淡出我们的视线,是时候整理下我的电脑和心情了……于是今天把该电脑该清理的东西进行了一下清理,此时惊讶的发现我的C盘当中没有多少空间了,于是我想到了重新分区。但是我觉得用第三方软件有些麻烦,于是我使用了windows 7自带分区工具,功能也不错。比第三方软件要安全的多。用win7自带工具一般有...

  • mysql利用二进制日志来进行恢复数据的实例操作

    mysql 利用二进制日志来进行恢复数据的实例操作备份开始前的工作环境准备: 1、创建用于保存二进制日志文件的目录# mkdir /mybinlog# chown mysql.mysql /mybinlog 2、修改配置文件# vim /etc/my.cnflog-bin=/mybinlog/mysql-bin 二进制日志目录及文件前缀...

CSDN

CSDN

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