3

我刚刚在 MSVC++2010 中为我的老板创建了一个 DLL。我选择了带有“导出符号”选项的“新 Win32 DLL”,所以一切都是完全标准的。新项目文件中有一些预定义的导出,一个类,它的构造函数,一个全局函数和带有虚假值的变量,以及一个带有 APIENTRY 函数的文件 dllmain.cpp。我什么都没改变。

现在我的老板想在他的 VB6 项目中使用导出的东西。他开始了一个 VB6 项目,做了菜单“项目”-“链接”(从德语翻译成英语,所以可能有些不同,但我相信你知道我的意思)并选择了一个 DLL 文件,就像他说的那样通常会。

但是,VB6 无法包含它,而是显示错误消息“无法包含 DLL 文件”(没有给出真正的原因)。来自 Visual C++ 6 的标准新 DLL 项目也是如此。我的老板认为这可能是因为符号没有真正导出,或者 VB6 需要一些特殊的声明。有谁知道问题是什么?

4

5 回答 5

7

是的,VB6 不能那样工作。您需要在 VB 代码中声明 DLL 函数,如下所示:

Private Declare Function WinHelp Lib "user32" Alias "WinHelpA" _
  (ByVal hwnd As Long, ByVal lpHelpFile As String, _
  ByVal wCommand As Long, ByVal dwData As Long) As Long

您可以将“user32”替换为“MyCPlusPlusDLL.dll”,并使用 DLL 中的实际方法名称和签名等。然后将 DLL 放在您的 /System 文件夹中,您应该一切顺利。

注意:这是假设 C++ DLL 中的方法是用“__declspec”声明的。

于 2011-01-28T15:43:49.913 回答
2

我看到您已经接受了答案,但这可能对您或其他人有用。通用 DLL 函数调用者,由 Paul Caton 使用汇编语言 voodoo 使 VB6 能够调用通常不能从 VB6 调用的不同类型的 DLL 函数。

于 2011-01-28T17:35:55.473 回答
1

在 C++ 中创建 DLL 并从 VB6 中使用它的最简单方法是使用 COM。

于 2011-01-28T15:34:06.487 回答
1

对于普通的DLL,不能使用VB引用,而需要使用Declare语句。另一种选择是将 DLL 创建为ActiveX 组件

于 2011-01-28T15:44:59.163 回答
1

如果它不是 COM 库,则只需导出带有__stdcall. 您可能需要为它们创建 .def 文件 (http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx)。还可以使用dependency walker,例如depends.exe 来查看导出了哪些函数以及使用了哪些名称。

于 2011-01-28T15:44:59.650 回答