荔园在线

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

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


发信人: Deny (要好好学习了!), 信区: Program
标  题: VB和VC混合编程
发信站: 荔园晨风BBS站 (Sat Jun 23 18:33:54 2001), 转信

问题:
  本人初学VC5,现与几个同事合作开发单位课题(WIN95应用程序)。我负责数据计
算,并将计算结果以图形的方式显示。由于计算的复杂性,也为提高速度,我准备
用VC5编程,但伙伴们却用VB5开发主界面。请指教: 我如何从VB5程序中获取数据
(数据量很大,且对传输速度要求很高),我又如何接管伙伴用VB5生成的窗口,
在不开新窗口,不破坏主界面的前提下,将图形输出到视窗的指定位置,并进行一
系列的图形操作;我应生成什么类型的文件,伙伴在VB5中如何调用我的程序?能
否举例说明?

回答:

    一般来说,VB和VC共同编程有3种方式:一种是VC生成DLL,在VB中调用DLL;
一种是VC生成ActiveX控件(.ocx),在VB中插入;还有一种是在VC中生成ActiveX
Automation服务器,在VB中调用。相对而言,第一种方法对VC编程者的要求最低,
但要求你的伙伴进行配合,我推荐这种方法。
    先说说VC++的编程。首先在VC++中生成Win32 DLL工程。在这个工程中添加几
个函数供VB用户调用。一个DLL中的函数要想被VB调用,必须满足两个条件:一是
调用方式为stdcall,另一个是必须是export的。要做到第一条,只须在函数声明
前加上__stdcall关键字。如:
    short __stdcall sample(short nLen, short *buffer)
    要做到第二条,需要在*.def文件中加上如下的几行:
    EXPORTS
     sample @1
    这里的sample是你要在VB中调用的函数名,@1表示该函数在DLL中的编号,每
个函数都不一样。注意这里的函数名是区分大小写的。至于你说的需要传递大量数
据,可以这样做,在VB中用一个数组存放数据,然后将该数组的大小和地址传给
VC(至于如何在VB中编程我会在下面介绍)。就象上面的例子,nLen是数组大小,
buffer是数组地址,有了这两条,你可以象使用VC的数组一样进行处理了。至于输
出图形,可以生成WMF或BMP格式,让VB调用。不过,我认为也可以直接输出到视窗
,只要VB将窗口的句柄hWnd和hDC以及视窗的绘图位置(VB和VC采用的坐标系必须一
致才行)传给VC就行了。而VB的AutoRedraw属性必须为False,在Paint事件中调用
VC的绘图程序。
    再谈谈VB的编程。VB调用DLL的方法和调用Windows API的方法是一样的,一般
在VB的书中有介绍。对于上面一个例子,先要声明VC函数:
    Declare Function sample Lib "mydll.dll" (ByVal nLen As Integer,
buffer As Integer) As Integer
    这里mydll.dll是你的dll的名字。你可能已经注意到了两个参数的声明有所不
同,第一个参数加上了ByVal。规则是这样的:如果在VC中某个参数声明为指针和
数组,就不加ByVal,否则都要加上ByVal。在VB中调用这个函数采用这样的语法:

    sample 10, a(0)
    这里的a()数组是用来存放数据的,10为数组长度,这里的第二个参数不能是
a(),而必须是要传递的数据中的第一个。这是VB编程的关键。
    下面在说几个可能遇到的问题。一个问题是VB可能报告找不到dll,你可以把
dll放到system目录下,并确保VB的Declare语句正确。另一个问题是VB报告找不到
需要的函数,这通常是因为在VC中*.def文件没设置。第三种情况是VB告诉不能进
行转换,这可能是在VC中没有加上__stdcall关键字,也可能是VB和VC的参数类型
不一致,注意在VC中int是4个字节(相当于VB的Long),而VB的Integer只有2个字节
。必须保证VB和VC的参数个数相同,所占字节数也一致。最后一个要注意的问题是
VC中绝对不能出现数组越界的情况,否则会导致VB程序崩溃。
    总的来说,你和你的伙伴需要一些时间来进行协调和摸索,但这种方法绝对可
行,也不难掌握。

    您回答了在VB中调用DLL文件中的函数问题,如果我想在VB中调用DLL文件中所
定义的类,那么该如何做呢?拜托!!!
    答:如果你说的DLL的类是Automation方式的,只要在VB的“引用”对话框中
添加该DLL就可以。但是如果该类是在VC++中以dllexport形式定义的,则除了
VC++,其他语言都无法调用。如果你想让VB以Declare的方式调用C++的类,你需要
改写DLL为普通C语言函数的形式,DLL内部可以使用类,但对外的调用接口必须是
简单的函数。

    spencer yang的意见:
    具体范例,请到纪文和网站 VB入门网
    http://www.vbguide.com.tw/webback.asp
    看看「个个击破」 单元中的
问题389 如何解一元二次方程式 (Quadratic Equation of One Variable)

--
所 为
为了大家的偷电事业,跳闸后请不要吵精诚所致,金石为开 为了我们的偷电事业,请不要?

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


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

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