荔园在线

荔园之美,在春之萌芽,在夏之绽放,在秋之收获,在冬之沉淀

[回到开始] [上一篇][下一篇]


发信人: Second (石开), 信区: Program
标  题: 如何用VC++和Visual Foxpro进行ActiveX数据通讯
发信站: 荔园晨风BBS站 (Fri Jun  8 07:54:01 2001), 转信

         在进行软件开发的过程中,如何在不同的编程工具之间进行数据交换和通讯,

需要进行不断的探索和总结。我们在开发机械cad仿真软件的过程中,遇到了在vc++中读
取和修改visual foxpro中数据的问题。经过许多次的试验,我们通过采用自动服务器(
activex automation)的方法圆满解决了这个问题。
      自动服务器,以前称为ole automation,后来称为activex ole automation,就
是编写能被其他程序调用的代码。其他程序不是以dll的孤立方式而是直接调用自动服务
器的用户代码。这其中比较难理解的概念是:自动服务器用户代码向其他应用程序揭示
了属性(变量)和方法(函数)。
     以下将以整型和双精度(对浮点型同样适用)的数据传递为例,讲述如何用activ
ex 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中生成cd
ata类,点击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 construc
tor
               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。

--
                            既然热爱生命
                            那么,
                            一切都在意料之中。

※ 来源:·荔园晨风BBS站 bbs.szu.edu.cn·[FROM: 192.168.28.190]


[回到开始] [上一篇][下一篇]

荔园在线首页 友情链接:深圳大学 深大招生 荔园晨风BBS S-Term软件 网络书店