我们将C ++程序编译为DLL,并希望从VB6中使用它。该程序有子程序,如
int __stdcall setup(int exposure_time, double shutter, double gain, int numImages) {
....
}
int __stdcall test() {
return 8;
}
Def文件定义为:
LIBRARY
EXPORTS
setup=setup
test=test
我们在VB6中声明它们是这样的:
Public Declare Function setup Lib "C:\MyDll.dll" () As Long
Public Declare Function test Lib "C:\MyDll.dll" () As Long
然后尝试以表格形式访问:
Private Sub Form_Load()
Debug.Print (test())
End Sub
但是当VB执行到第一个函数调用时,我们正在VB中找到“File not found”! MyDll.dll程序位于声明的位置,不能注册。遗漏了什么?
Hello Bathsheba,
我按照你的建议但是VB程序仍然找不到dll。
VB中的声明:
Public Declare Function setup Lib "C:\Math\FlyCapture2\bin\PGLCTrigger.dll" ( _
ByVal exposure_time As Long, _
ByVal shutter As Double, _
ByVal gain As Double, _
ByVal numImages As Long) As Long
Public Declare Function test Lib "C:\Math\FlyCapture2\bin\PGLCTrigger.dll" () As Long
Def File:
LIBRARY
EXPORTS
setup=@1
test=@2
C ++程序:
__declspec(dllexport) int __stdcall setup(int exposure_time, double shutter, double gain, int numImages) {
....
}
__declspec(dllexport) int __stdcall test() {
return 8;
}
VB调用程序:
Private Sub Form_Load()
setup 12, 24#, 1#, 10
test
End Sub
一旦执行到达上面程序中的设置行,就会出现“dll not found”错误。
我按照Compile a DLL in C/C++, then call it from another program的建议在.def文件中定义了以下内容:
//DLL Export-Import definitions
#ifdef BUILD_DLL
#define EXPORT __declspec(dllexport)
#else
#define EXPORT __declspec(dllimport)
#endif
这样我就可以将DLL中的函数引用为
EXPORT int __stdcall setup(int exposure_time, double shutter, double gain, int numImages)
但VS2010会为导入生成错误消息。
所以我被卡住了。任何进一步的帮助将不胜感激。谢谢。
答案 0 :(得分:1)
其他人告诉过你必须声明函数的参数。如果DLL无法加载,并且您确定它在那里,则可能缺少依赖项。使用Dependency Walker进行调试。加载可执行文件并从“配置文件”菜单以配置文件模式运行它。这将记录加载器事件,您将确切地看到失败的原因。
答案 1 :(得分:0)
您需要告诉VB6 setup
的函数参数:
Public Declare Function setup Lib "C:\MyDll.dll" ( _
ByVal exposure_time As Long, _
ByVal shutter As Double, _
ByVal gain As Double, _
ByVal numImages A Long) As long
我认为您的.def文件不正确。我用
EXPORTS
setup @1
test @2
其中1和2是任意但不同的正整数,称为序数。几句话:
VB中的Long
是C ++中的int
。
您可以使用__declspec(dllexport)
和extern "C" {/*your function here*/}
代替.def文件。