我正在关注指南: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")失败 - 找不到指定的模块。
如何解决这个问题?
更新: 我已经进一步研究了这个问题,请参考" Martin Schlott"回答,碰巧VC ++编码DLL函数,因此我会在DLL中有一个有趣的名称。
使用dumpbin.exe,可以在$ \ Visual Studio \ VC \ bin中找到,我能够读取存储在DLL中的函数名称。这就是我最初得到的:
1 0 00001050 ?Add@MyMathFuncs@MathFuncs@@SANNN@Z = ?Add@MyMathFuncs
@ MathFuncs @@ SANNN @ Z(public:static double __cdecl MathFuncs :: MyMathFuncs :: Add(d ouble,双))
"添加@ MyMathFuncs @ @@ MathFuncs SANNN @ Z" - 我将不得不称之为VB6中的一个函数,以便工作......并且它不会...所以我必须解码通过在其中创建定义文件(.def)来完成的名称C ++ DLL应用程序
在新的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)
功能"添加"返回一个double,在上面的声明中,我声明应该推送值并且不给出返回值。所以我遵循了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!
答案 0 :(得分:1)
你正在做的事情有几点不对。有趣的是,它应该工作。
如果直接指定DLL,则无需使用regsvr32注册它。
读: https://msdn.microsoft.com/en-us/library/aa716201(v=vs.60).aspx
resvr32期望COM Conform的特殊导出函数在注册表中注册DLL。例如,可以使用COM能力DLL。使用CoCreateInstance而非声明。
如果您不知道这一点,则regsvr失败。
也不要将属于您的Project的DLL复制到system32文件夹中。它不属于那里,现在是不好的行为。出于磁盘内存的原因,这可能是几个世纪前的必要,但不是今天。
将DLL复制到VB程序所在的同一文件夹中。纠正
的路径Private Declare Function Add Lib "Win32Project1.dll" (ByVal a As Double, ByVal b As Double)
并且正如某人已经建议的那样,使用依赖性walker。如果缺少以“MS”开头的dll。阅读以下答案:
https://stackoverflow.com/a/18600033/1922748
安装适当的redist。
<强>更新强>
您写道,您错过了“MSVCR120 D .DLL”。如果您在调试模式而不是发布模式下编译DLL,则会发生这种情况。没有Visual Studio,您无法安装MSVCR120D.DLL。您需要在发布模式下编译DLL并安装redist。
<强> 2。第二次更新
关于您的上一次评论,缺少入口点。 你必须导出功能!添加
__declspec(dllexport)
在您要导出的功能之前。看这里 https://msdn.microsoft.com/de-de/library/3y1sfaz2.aspx
您在C ++中的声明应如下所示:
__declspec(dllexport) double Add(double val);
你可以忘记dllimport,在你的情况下你不需要它。