【发布时间】:2015-02-18 17:03:28
【问题描述】:
我正在关注以下指南:https://msdn.microsoft.com/en-us/library/ms235636.aspx
我已经创建了一个如上所述的 DLL,现在我想将它包含在我的 VB6 应用程序中
我已经在代码中声明了一个函数:
Private Declare Function Add Lib "C:\WINDOWS\system32\Win32Project1.dll" (ByVal a As Double, ByVal b As Double)
在表单加载中我声明了一些变量并调用了一个函数
Dim a As Double
Dim b As Integer
a = 7.4
b = 99
Call Add(a, b)
每次我运行程序时,我都会收到一个错误,即找不到文件。 文件存在于 C:\WINDOWS\system32\ 中,我确实尝试使用以下方法注册 dll:
regsvr32 Win32Project1.dll
但我不断收到错误: LoadLibrary("Win32Project1.dll") failed - 找不到指定的模块。
如何解决?
更新: 我已经进一步研究了这个问题,请参阅“Martin Schlott”答案的第 2 步,并且碰巧 VC++ 对 DLL 函数进行了编码,因此我会在 DLL 中有一个有趣的函数名称。
使用可以在 $\Visual Studio\VC\bin 中找到的 dumpbin.exe,我能够读取存储在 DLL 中的函数名称。这是我最初会得到的:
1 0 00001050 ?Add@MyMathFuncs@MathFuncs@@SANNN@Z = ?Add@MyMathFuncs
@MathFuncs@@SANNN@Z (public: static double __cdecl MathFuncs::MyMathFuncs::Add(d 双重,双重))
"?Add@MyMathFuncs@MathFuncs@@SANNN@Z" - 是我必须在 VB6 中调用的函数才能使事情正常工作......它不会......所以我不得不解码通过在 C++ DLL 应用程序中创建定义文件 (.def) 来完成的名称
在新的 Source.def 文件中,我定义了我想要“添加”功能:
LIBRARY
EXPORTS
Add
在“发布”模式下重建解决方案后,dumpbin 给了我一个更好的结果。但是,__cdecl 会自动添加到 VC++ 中的每个函数中,除非另有说明,而且 __cdecl 恰好不允许在 VB6 中使用函数。如果您现在运行 VB6 应用程序,您将收到一个新错误“错误的 DLL 调用约定”。
为了解决这个问题,我必须修改“MyMathFuncs.h”文件,其中我定义了要导出和更改的函数
"static MATHFUNCSDLL_API double Add(double a, double b);"
到
"static MATHFUNCSDLL_API double __stdcall Add(double a, double b);"
之后,dumpbin.exe 返回了更好的值:
1 3 00001050 Add
但这并没有完全解决我的问题,我仍然会得到“错误的 DLL 调用约定”,这是由于我在 VB6 中引用库的方式
Private Declare Function Add Lib "Win32Project1.dll" (ByVal a As Double, ByVal b As Double)
函数“Add”返回一个双精度值,在上面的声明中我声明值应该被推送并且没有给出返回值。所以我遵循了我在 C++ 中的函数格式,并添加了一个与 C++ 文件中的数据类型匹配的正确数据类型的返回:
Private Declare Function Add Lib "Win32Project1.dll" (ByVal a As Double, ByVal b As Double) As Double
现在当我跑步时:
Dim a As Double
Dim b As Integer
a = 7.4
b = 99
MsgBox (Add(a, b))
我有一个消息框指出结果是 106.4!
【问题讨论】:
-
我使用了“Dependency Walker”程序,发现我缺少MSVCR120D.DLL
-
如果您仍有问题stackoverflow.com/questions/14281368/…,此问题中的建议及其接受的答案可能会很有用