1

这是这个问题的后续问题,因为我现在正在失去理智。

有人指给我看这篇文章,我正试图从那里复制第 4 节。

所以我在 MSVC++2010 中创建了一个空的 C++ 项目,在其中创建了一个新的 .cpp 文件,并将以下代码放入其中:

#include <windows.h>
#define CCONV _declspec(dllexport) // used to be __stdcall but resulting DLL is identical

int CALLBACK LibMain (HANDLE hInstance, WORD wDataSeg, WORD wHeapSize,
LPSTR lpszCmdLine)
{
     return 1;
}

short CCONV PassInteger (short intgr, short far *pintgr)
{
    *pintgr = intgr;
    return intgr + 1;
}

(我从这里LibMain得到了代码,但我认为它在这里没有做任何事情。)

然后,我在项目中添加了一个 .def 文件并将其放入其中:

;vb6dll32 DEF File
LIBRARY vb6dll32

CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE

EXPORTS
PassInteger

编译器在当前目标不支持 .def 文件中输出两个警告CODE,但它最终会编译并生成文件,然后我将其复制到and和。DATAvb6dll32.dllC:\windows\system...\system32C:\

然后我创建了一个 VB6 项目,在表单中放了一个按钮并添加了这个源代码:

Private Declare Function PassInteger Lib "vb6dll32.dll" _
(ByVal intgr As Integer, pintgr As Integer) As Integer

Private Function BuiltIntest() As Integer

    Dim i As Integer
    Dim ir As Integer

    i = 7

    i = PassInteger(i, ir)
    Print i, ir

    Return

End Function

Private Sub Command1_Click()
    MsgBox (BuiltIntest())
End Sub

现在,当我单击按钮时,它仍然给我“运行时错误'53':找不到文件 vb6dll32.dll。” (即使我在 VB 源代码中给它一个完全指定的路径,也会发生这种情况,例如“C:\vb6dll32.dll”并且文件肯定在那里。我尝试在没有路径和没有“.dll”的情况下给出它的位置等等, 没有什么变化。)

让我烦恼的是,当我运行regsvr32 c:\vb6dll32.dll它时,它还告诉我“模块 C:\vb6dll32.dll 无法加载。等等等等”.. 我不知道它应该做什么,但通常应该对 DLL 文件做一些事情,对?

我究竟做错了什么?!谢谢你的帮助。

4

3 回答 3

4

在您的示例(代码和 regsvr32 调用)中,您指的是c:\vb6dll32.dll. 但是你说你把它复制到了system32目录。您指定的路径要求它位于根目录中。由于您将其复制到 system32 目录,因此它应该可以在没有任何路径的情况下工作。尝试c:\从名称中删除 。

编辑由于我在各个方面都在罢工,你可能会犹豫是否听从我的建议……但Dependency Walker可能会帮助解决这个问题。可能是找不到您的 DLL 所需的 DLL(例如,CRT DLL 之一)。这个depends.exe 实用程序是一个非常有用的工具,它会显示是否缺少任何必要的DLL。

于 2011-02-14T14:22:18.947 回答
3

也许您的 vb6dll32.dll 是动态链接的,并且依赖于诸如 MSVCR100.dll 之类的东西,这不容易找到。检查导入并将这些 dll 放在 vb6dll32.dll 旁边,或静态链接 (/MT /LD)。
此外,您真的不需要 .def 文件中的这些 CODE 和 DATA 行。

于 2011-02-14T15:18:26.370 回答
1

LibMain 来自 16 位窗口。您应该使用 DllMain。http://msdn.microsoft.com/en-us/library/ms682583(v=vs.85).aspx。您可以查看 fdwReason 与 DLL_PROCESS_ATTACH 和 DLL_PROCESS_DETACH 何时使用 LoadLibrary 加载和卸载 dll。您可以在 DllMain 中使用的内容有一些规定,例如没有非托管代码。

于 2011-02-14T14:22:38.953 回答