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

原创 2001年05月12日 04:51:00

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

 

 

VC ActiveX 控件 开发总结

VC 制作ActiveX 控件(OCX) http://ileson.iteye.com/blog/1002910 1、vc6下建立一下activeX工程     详见http://hi...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年03月27日 12:19
  • 1538

图解VC++开发ActiveX控件C#调用

1 新建ActiveX控件工程 2 编译,运行 使用下图所示VC++自带测试工具来测试ActiveX控件; 3 测试容器 插入刚做的ActiveXDemo1控件 4...
  • bcbobo21cn
  • bcbobo21cn
  • 2016年04月25日 14:08
  • 1815

使用 VFP ( Microsoft Visual FoxPro ) 设计一个简易计算器(下)

五、创建程序: 1、打开项目管理器(不小心关掉了的可以打开文件--》xxx.pjx),切换到“代码”--》程序--》新建 2、在弹出的程序框中编辑如下代码: set defaul...
  • wangwenjing90
  • wangwenjing90
  • 2013年04月19日 17:18
  • 7918

VC++编写ActiveX控件

 前言:ocx是ocx控件的扩展名,OCX 是对象类别扩充组件。如果你用过Visual Basic或者Delphi一类的可视化编程工具,那么对控件这个概念一定不会陌生,就是那些工具条上的小按钮,...
  • jfx
  • jfx
  • 2015年12月29日 16:39
  • 525

如何自动使用 c + + 的嵌入的 Office ActiveX 文档

vc中嵌入excel的链接 http://support.microsoft.com/kb/307473 http://support.microsoft.com/kb/311546/en...
  • guomeiran
  • guomeiran
  • 2014年04月21日 21:30
  • 1024

摆脱VC++6.0,教你如何用visual Studio2010完美运行C++程序

Visual Studio 2010是microsoft公司在2010年4月12日推出的最新的开发环境,鉴于本学期学习C++,笔者认为VC++6.0是早已经该淘汰的开发环境了,并且近日VC++6.0在...
  • HHXUN
  • HHXUN
  • 2016年07月02日 12:31
  • 4657

VC2010如何给ActiveX添加事件

http://blog.sina.com.cn/s/blog_4a0f795b01014vl5.html 利用VC开发ActiveX时,需要给控件添加标准事件或自定义事件,在VC6中有多种方...
  • whbo111
  • whbo111
  • 2016年06月13日 16:06
  • 1137

使用 VFP ( Microsoft Visual FoxPro ) 设计一个简易计算器(上)

没有接触过VFP,因为公司项目需要VFP实现修改位图DPI,所以过来摸索一下VFP怎么用。       百度查VFP,百度百科的名词解释是:http://baike.baidu.com/view/5...
  • wangwenjing90
  • wangwenjing90
  • 2013年04月19日 15:54
  • 14967

带你玩转Visual Studio——带你了解VC++各种类型的工程

Visual C++各种工程类型: ATL ATL Project CLR Class Library CLR Console Application CLR Empty Project Windo...
  • luoweifu
  • luoweifu
  • 2015年09月30日 00:48
  • 17517

VC++编写ActiveX控件

VC++编写ActiveX控件 作者:一点一滴的Beer http://beer.cnblogs.com/   前言:      暑假在做一个项目的时候,本来是用C#.NET来写的一个港口进出...
  • yangjian900109
  • yangjian900109
  • 2013年01月18日 14:47
  • 402
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:如何用VC++和Visual Foxpro进行ActiveX数据通讯
举报原因:
原因补充:

(最多只允许输入30个字)