找不到从 VB6 调用的 C++ DLL 程序

Posted

技术标签:

【中文标题】找不到从 VB6 调用的 C++ DLL 程序【英文标题】:C++ DLL program called from VB6 cannot be found 【发布时间】:2013-10-01 15:34:19 【问题描述】:

我们将 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++, 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 会为导入生成错误消息。

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

【问题讨论】:

请给我们准确的错误信息 你好大卫,错误是“运行时错误'48',文件未找到c:\...\MyDll.dll,当执行在“设置12,24时从VB6返回, 1,10"。 【参考方案1】:

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

【讨论】:

如果我在 Dependency walker 下运行 PCTriggerDll.Dll,我会收到一堆 API-MS-Win... 错误,如果我运行 Vb 程序可执行文件,则会收到 MSVBVM60.dll not found 错误。但即使我将此文件放入可执行文件正在运行的目录中,它仍然找不到 dll。所以你可能是对的,可能缺少依赖文件。但是是哪一个。 不用担心 DLL 的静态分析错误。重要的是运行时。看起来您缺少一些 VB6 运行时文件。 我把一些文件放在VB调用程序运行的可执行文件中。它运行良好!但是程序在VB开发环境中找不到DLL!你可能是对的。我需要寻找必要的文件。再次感谢您。 好吧,我很高兴让您走上正确的道路。也许您可以借此机会了解投票和接受:meta.stackexchange.com/questions/5234/… 我注意到您也从未这样做过。您当然应该回顾以前的问题并尝试接受最佳答案,并为有帮助的答案投票。 大卫,通过让我关注正确的问题,您帮助我解决了问题。我找到了依赖程序,现在它正在运行。非常感谢你。我一定会投票并接受你的回答。真诚的,【参考方案2】:

你需要告诉 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 是任意但不同的正整数,称为 ordinals。几点说明:

VB 中的Long 是C++ 中的int

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

【讨论】:

您好,芭丝谢芭,感谢您的帮助。我遵循了您的建议,但仍然收到 DLL not found 错误。有关更多代码,请参阅上面我的问题中的文本。还有什么想法吗? 是的,照大卫赫弗南说的做。并尝试将 MSVBVM60.dll 放在与 PGLCTrigger.dll (或您所称的任何名称)相同的文件夹中;只是作为一种临时措施,直到你弄清楚发生了什么。

以上是关于找不到从 VB6 调用的 C++ DLL 程序的主要内容,如果未能解决你的问题,请参考以下文章

从.Net到vb6的Web服务的DLL - 如何设置app.config

C#导入c++ dll报找不到dll文件 masm32调用c++类库

Win7下在Visual Studio 2008里运行程序时出现找不到MFC90D.dll文件, Command Prompt找不指定路径

是否可以同时调试 VB6 和 C++ COM dll?

c#调用c++写的dll,用dllimport后说啥 找不到指定模块。这个问题你是怎么解决的

如何在不通过 COM 的情况下从 VB6 调用 C++ DLL?