Chinaunix首页 | 论坛 | 博客
  • 博客访问: 600678
  • 博文数量: 30
  • 博客积分: 8020
  • 博客等级: 中将
  • 技术积分: 1125
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-31 16:14
文章分类

全部博文(30)

文章存档

2011年(1)

2010年(3)

2009年(5)

2008年(21)

分类: C/C++

2010-01-19 09:26:10

前几天一网友如何在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的方法很多,本人才疏学浅,在此抛砖引玉。不足之处,敬请原谅。不对之处,请指出,力争改正。
阅读(4455) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~