1

我们将 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 中得到“找不到文件”!MyDll.dll 程序位于声明的位置,它不被注册。缺少什么需要申报?

你好,芭丝谢芭,

我听从了你的建议,但 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

定义文件:

 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”错误。

我按照Compile a DLL in C/C++ 的建议在 .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 会为导入生成错误消息。

所以我被困住了。任何进一步的帮助将不胜感激。谢谢你。

4

2 回答 2

1

其他人告诉你,你必须为函数声明参数。如果 DLL 不会加载,并且您确定它在那里,那么它可能缺少依赖项。使用 Dependency Walker 进行调试。加载可执行文件并从“配置文件”菜单以配置文件模式运行它。这将记录加载程序事件,您将确切地看到失败的原因。

于 2013-10-02T18:35:47.907 回答
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 是任意但不同的正整数,称为序数。几点说明:

LongVB 中的A是intC++ 中的。

您可以使用__declspec(dllexport)andextern "C" {/*your function here*/}代替 .def 文件。

于 2013-10-01T15:45:24.367 回答