这是this question的后续问题,因为我现在对此已经失去了理智。
有人向我指出this article,我正试图从那里复制第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;
}
(我从here获得了LibMain
代码,但我认为这里没有做任何事情。)
然后,我在项目中添加了一个.def文件并将其放入其中:
;vb6dll32 DEF File
LIBRARY vb6dll32
CODE PRELOAD MOVEABLE DISCARDABLE
DATA PRELOAD MOVEABLE
EXPORTS
PassInteger
编译器输出两个警告,当前目标不支持.def文件中的CODE
和DATA
,但它最终会编译并生成我拥有的文件vb6dll32.dll
已复制到C:\windows\system
和...\system32
以及C:\
。
然后我创建了一个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文件做些什么,对吗?
我做错了什么?!谢谢你的帮助。
答案 0 :(得分:4)
在您的示例(代码和regsvr32调用)中,您指的是c:\vb6dll32.dll
。但是你说你把它复制到system32目录。您指定的路径将要求它位于根目录中。由于您将其复制到system32目录,因此它应该没有任何路径。尝试从名称中删除c:\
。
编辑由于我在所有方面都很突出,你可能会犹豫不决地遵循我的建议......但是Dependency Walker可能有助于解决这个问题。可能是您的DLL所需的DLL未被找到(例如,CRT DLL之一)。这个depends.exe实用程序是一个非常有用的工具,将显示是否缺少任何必要的DLL。
答案 1 :(得分:3)
也许你的vb6dll32.dll是动态链接的,取决于像MSVCR100.dll这样的东西
不容易找到。检查导入并将这些dll放在vb6dll32.dll旁边,或者
静态链接(/ MT / LD)。
另外,你真的不需要.def文件中的这些CODE和DATA行。
答案 2 :(得分: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中可以使用的内容有一些规定,例如没有非托管代码。