我需要在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没有错误地调用它们。
答案 0 :(得分:3)
BitmapFile_Close应该在VB6中声明为Sub。我看不出别的什么错。
查看编写要从VB调用的C DLL的Microsoft advice。最初与VB5一起发布但仍与VB6相关。
答案 1 :(得分:0)
尝试逐个从相关参数中删除ByVal(在声明部分内),然后测试并尝试删除所有参数,然后再次测试。如果可以的话,进行增量测试并报告。那应该是诀窍!
答案 2 :(得分:0)
使用MIDL为您的DLL生成类型库,然后VB6可以使用其类型信息而不是Declare Function
例程。
对于全局函数,我似乎记得您需要定义library
和module
。