本站首页    管理页面    写新日志    退出


«July 2025»
12345
6789101112
13141516171819
20212223242526
2728293031


公告

谦卑,荣誉,牺牲,英勇,怜悯,诚实,精神,公正。


我的分类(专题)

日志更新

最新评论

留言板

链接

 

 


Blog信息
blog名称:
日志总数:183
评论数量:698
留言数量:7
访问次数:3017825
建立时间:2005年12月29日




[编程学习]笔记4.12
网上资源,  读书笔记

newqiang 发表于 2006/4/13 20:03:29

VB和VC混合编程     一般来说,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程序崩溃。     总的来说,你和你的伙伴需要一些时间来进行协调和摸索,但这种方法绝对可行,也不难掌握。          相关问题:     用VC写的程序中调用用VB写的函数和方法"          您回答了在VB中调用DLL文件中的函数问题,如果我想在VB中调用DLL文件中所定义的类,那么该如何做呢?拜托!!!     答:如果你说的DLL的类是Automation方式的,只要在VB的“引用”对话框中添加该DLL就可以。但是如果该类是在VC++中以dllexport形式定义的,则除了VC++,其他语言都无法调用。如果你想让VB以Declare的方式调用C++的类,你需要改写DLL为普通C语言函数的形式,DLL内部可以使用类,但对外的调用接口必须是简单的函数。  


阅读全文(8134) | 回复(2) | 编辑 | 精华
 


回复:笔记4.12
网上资源,  读书笔记

newqiang发表评论于2006/4/14 21:55:00

最好设一个断点,这样就不容易跳进去了,同时即使进了汇编,仍然会 有原来的C++语句在相应的位置出现的,只是看其来不方便


个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:笔记4.12
网上资源,  读书笔记

Chyna(游客)发表评论于2006/4/13 23:05:21

抱歉 是蹦到汇编状态

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


回复:笔记4.12
网上资源,  读书笔记

Chyna(游客)发表评论于2006/4/13 23:03:07

刘大牛,在vc调试时按F10后就直接蹦到编译状态,是什么原因?望不吝赐教。Thanks!

个人主页 | 引用回复 | 主人回复 | 返回 | 编辑 | 删除
 


» 1 »

发表评论:
昵称:
密码:
主页:
标题:
验证码:  (不区分大小写,请仔细填写,输错需重写评论内容!)



站点首页 | 联系我们 | 博客注册 | 博客登陆

Sponsored By W3CHINA
W3CHINA Blog 0.8 Processed in 0.031 second(s), page refreshed 144751941 times.
《全国人大常委会关于维护互联网安全的决定》  《计算机信息网络国际联网安全保护管理办法》
苏ICP备05006046号