用C ++创建DLL

时间:2011-02-14 14:16:30

标签: c++ dll vb6 dllexport

这是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文件中的CODEDATA,但它最终会编译并生成我拥有的文件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文件做些什么,对吗?

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

3 个答案:

答案 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中可以使用的内容有一些规定,例如没有非托管代码。