前几天一网友如何在VB中调用VC,寻思以前做过,所以又拿出来研究了下。
VB中调用VC动态库有俩中方式,一是Dll中调用API;一是将动态库封装为组件,在VB中被调用。
一。 调用API的方式很简单,就和调用系统API一样。申明一个函数,然后在VB中直接使用该函数。如:
调用发送消息函数 SendMessage ,可以声明如下:
------------------------------分割线-------------------------------------------------
Public
Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal
hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any)
As Long
------------------------------分割线-------------------------------------------------
然后在过程或函数中调用 SendMessage( hwnd, WM_MSG, WParam, LParam)即可。
当然这只是调用API的一般过程。
如果自己编写动态库的话那就必须注意以下几个问题了。第一是调用约定问题,你必须将函数设定为系统API。
申明函数如下:
------------------------------分割线-------------------------------------------------
extern "C" {
Type _declspec(dllexport) YourFun( params );
}
------------------------------分割线-------------------------------------------------
' extern "C" '中的“C”是必须的,他指明函数按照C标准导出,否则函数将按照C++方式导出,这样会使函数名增加一些前缀或后缀。
另一个需要注意的是参数问题。如何你的函数参数只是简单基本类型,没有数组等,那么你可以直接使用。但如果使用结构体和数组,那就需要特别注意。
对
于结构体,我建议最好不要使用,除非你对结构体的编译很清楚。同一个语言中,你很容使结构体在二进制代码级保持一致(即使是同一种语言不同模块也可能导致
逻辑出错)。不同的语言就更得消息其结构在代码级的一致性。这种错误代码级的不一致将导致严重的错误,而编译一般不会发现。
VB调用VC
动态库最长见的是将一些算法逻辑或通信接口放在VC动态库中实现效率提升。这需要解决的是VC动态库和VB进行大量数据交互。常见的有字符串(char类
型数组)传递和long/interger数组等。在模块间传递字符串口可以传递char数组。在VC的参数中申明 “char* pCh
”,VB中定义DIM ch(0 to n) as
char即可。VB中的“ch”包含了长度信息,但是VC中的“pCh”并不包含长度,所以为了安全,你最好在函数接口增加长度参数。long数组以及
interger数组的传递类似。VB还有一个数据类型就是String。如果要在VB和VC模块间传递String对象,那么你必须在VC的函数参数中
申明为char**p,通过测试发现传递给VC动态库的指针并不指向字符串,而是指向一个“指向字符串”的指针。举一个例子,以方便理解
----------------------------------分割线------------------------------------------------------
VC部分
extern "C" {
int _declspec(dllexport) TestCharFun( char* p , int nLength ); // 函数体忽略
int _declspec(dllexport) TestStringFun( char** p , int nLength );
}
VB部分
' 申明部分
Public Declare Function TestChar Lib "TestDll" Alias "TestCharFun" ( p As Any, nLen as Long) As Long
Public Declare Function TestString Lib "TestDll" Alias "TestStringFun" ( p As Any, nLen as Long) As Long
public sub
dim a as string
dim b(0 to 5) as char
a = "123456789" ' 使用前一定要赋值或开辟一个空间,否则其长度为0,VC中将不能访问
TestChar b(0), 6
TestString a, 9
end sub
----------------------------------分割线------------------------------------------------------
二。 组件中调用
组件中调用更简单,只需要将组件添加到界面中,定义为一个对象后,直接调用该对象的方法即可。
对于数组传递建议VC中使用Variant对象。VB中的数组传递给组件时可以在内部转化为Variant对象。这种方法我使用过,可以实现。
当然VB调用VC的方法很多,本人才疏学浅,在此抛砖引玉。不足之处,敬请原谅。不对之处,请指出,力争改正。
阅读(4517) | 评论(0) | 转发(0) |