VB6 dll调用win32 C函数

时间:2012-01-28 02:22:13

标签: winapi dll vb6

我需要在C中为其他人的VB6项目编写一些函数(过时的内容超出了本问题的范围)。

在初始测试期间,我无法接听电话。我提供了一个.def文件,我试图使用__declspec(dllexport),stdcall和WINAPI调用约定。每次调用我都会在VB6中收到一条错误消息,说“"坏dll调用约定。”#34;

Win32 C函数原型:

long WINAPI BitmapFile_Open(char *pszFileName);
void WINAPI BitmapFile_Close(long bmf);

注意上面我已经尝试了其他几个调用约定,包括__declspec(dllexport)和stdcall,但都没有工作。

Def文件:

LIBRARY ImageLib
EXPORTS
BitmapFile_Open @1
BitmapFile_Open @2

VB全球模块:

 Declare Function BitmapFile_Open Lib "ImageLib.dll" (ByVal fileName As String) As Long
 Declare Function BitmapFile_Close Lib "ImageLib.dll" (ByVal bmFile As Long)

VB代码:

Dim myFile As Long
myFile = BitmapFile_Open("test.bmp")
BitmapFile_Close (myFile)

另请注意,在原始函数中,bmFile实际上是一个地址(指向结构的指针),但在VB中它将表示为long。但是,由于VB6不支持指针,因此我在C代码中进行了长时间的转换。我希望你能理解我想要到达的地方。它与正在发生的错误无关。任何帮助表示赞赏。

编辑:我使用了依赖步行器来确定功能确实正在导出。 VB6没有错误地调用它们。

3 个答案:

答案 0 :(得分:3)

BitmapFile_Close应该在VB6中声明为Sub。我看不出别的什么错。

查看编写要从VB调用的C DLL的Microsoft advice。最初与VB5一起发布但仍与VB6相关。

答案 1 :(得分:0)

尝试逐个从相关参数中删除ByVal(在声明部分内),然后测试并尝试删除所有参数,然后再次测试。如果可以的话,进行增量测试并报告。那应该是诀窍!

答案 2 :(得分:0)

使用MIDL为您的DLL生成类型库,然后VB6可以使用其类型信息而不是Declare Function例程。

对于全局函数,我似乎记得您需要定义librarymodule

请参阅VB - Linking a DLL in implicit way