含有指针传入参数的DLL函数,如何在VB中调用

方法一:

VB默认的传递方式就是传指针(ByRef,也就是把变量的地址传递给所调用的函数)。如果要传值(也就是把变量的值传递给所调用的函数)反要在参数声明前加ByVal。所以如果你传递的参数是普通的数据类型,在参数前什么都不要加就行了。如C语言声明为:    
          void   __stdcall   MyProc(short   *   nPara);    
          则VB声明为:    
          Declare   Function   MyProc   Lib   "MyDll.dll"   (nPara   As   Integer)    
          调用时同普通函数。    
          如果C语言中的指针是字符串指针,那么在VB声明时需要加上ByVal,这是个例外。如C语言声明为:    
          void   __stdcall   MyProc(char   *   sPara);    
          则VB声明为:    
          Declare   Function   MyProc   Lib   "MyDll.dll"   (ByVal   sPara   As   String)    
          调用时同普通函数。    
          如果C语言的指针是数组指针,则在VB中调用时应将数组的首元素传递给DLL。如C语言声明为:    
          void   __stdcall   MyProc(int   []   arrPara);    
          则VB声明为:    
          Declare   Function   MyProc   Lib   "MyDll.dll"   (nPara   As   String)    
          调用时为MyProc   A(0)。    
          注意:不能直接传递数组名,因为如果传递数组名,VB实际会传一个复杂的结构类型给DLL,这对编写C语言的DLL来说,处理这样的结构比较麻烦,所以通常都不支持这种方式。

方法二:

C++ 函数需要指针到 C 函数或传递一个数组

考虑 C 函数或 C++ 函数具有以下原型: 通过引用因为 Unicode 到 ANSI - 转换发生 VisualBasic 数组包含字符串, 时无法直接传递数组的第一个用户定义数据类型元素。 但是, 可使用 VarPtr 函数来通过值传递的第一个用户定义数据类型元素数组的地址。

要从 VisualBasic, 调用 Func10 函数请按照下列步骤操作:

1.切换到 VisualC++6.0。
2.在文件视图, StdDLL.cpp , 右击, 然后单击 打开 。
3.Func9 函数之后添加以下代码:
long __declspec (dllexport) __stdcall Func10(MYSTRUCTURE *pstructMyStruct, long lSize){
   return 10;
}
4.在文件视图, StdDLL.def , 右击, 然后单击 打开 。
5.将以下文本追加到 StdDLL.def 文件中现有文本:
Func10
6.在 生成 菜单上, 单击 Build StdDLL.dll 。
7.单击 文件 菜单, 关闭工作区 。

注意 如果您收到消息来保存或关闭文档窗口, 单击
8.切换到 Visual Basic 6.0。
9.在 @ @ @ ProjectExplorer@@, 右击 Module 1 , 依次 查看代码 。
10.以下代码附加到 Module 1 模块中现有代码:
Declare Function Func10 Lib"C:/StdDLL/Debug/StdDLL.dll" (ByVal AddressOfFirstStruct As Long, ByVal Size As Long) As Long
11.在 @ @ @ ProjectExplorer@@, 右击 Form 1 , 依次 查看代码 。
12.以下代码附加到 Command 1 _ Click 事件过程中现有代码:
Dim MyArrayOfStructs(1) As MYSTRUCTURE
MyArrayOfStructs(0).MyLong = 0
MyArrayOfStructs(0).MyString = "Zero"
MyArrayOfStructs(1).MyLong = 1
MyArrayOfStructs(1).MyString = "One"

Result = Func10(VarPtr(MyArrayOfStructs(0)), 2)
MsgBox ("Func10 returned " & Result)

long __declspec (dllexport) __stdcall Func10(MYSTRUCTURE *pstructMyStruct, long lSize);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值