方法一:
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 函数之后添加以下代码: |
4. | 在文件视图, StdDLL.def , 右击, 然后单击 打开 。 |
5. | 将以下文本追加到 StdDLL.def 文件中现有文本: |
6. | 在 生成 菜单上, 单击 Build StdDLL.dll 。 |
7. | 单击 文件 菜单, 关闭工作区 。 注意 如果您收到消息来保存或关闭文档窗口, 单击 是 。 |
8. | 切换到 Visual Basic 6.0。 |
9. | 在 @ @ @ ProjectExplorer@@, 右击 Module 1 , 依次 查看代码 。 |
10. | 以下代码附加到 Module 1 模块中现有代码: |
11. | 在 @ @ @ ProjectExplorer@@, 右击 Form 1 , 依次 查看代码 。 |
12. | 以下代码附加到 Command 1 _ Click 事件过程中现有代码: |
long __declspec (dllexport) __stdcall Func10(MYSTRUCTURE *pstructMyStruct, long lSize);