【问题标题】:DLL Export C/C++ 6.00 function invoked by VB6VB6调用的DLL导出C/C++ 6.00函数
【发布时间】:2024-01-07 09:25:01
【问题描述】:

我一直在尝试使用 C/C++ 创建一个可以通过 VB6 访问的 DLL,这是正确的,在从 VB6 调用该函数时,我收到错误“453 Can't find DLL entry point myFunctionName in myDllName.dll”应用程序。 在搜索了包括这个网站在内的网络后,我发现我并不孤单,我已经尝试了发布的各种解决方案,但错误“453”是无法解决的。 这不是 COMM dll,我相信通过 C/C++ 创建是可能的。 无论如何,如果可以,请提供帮助。请参考下面的简单测试用例:

作为 C/C++ 6.00 Win32 动态链接库创建的 DLL:

#include <Windows.h>   

// Note that I did try the line below rather than the def file, but to no avail...  
// #pragma comment(linker, "/EXPORT:ibask32=_ibask32@0")

// Function definition   
extern "C" int __declspec(dllexport) __stdcall ibask32()   
{   
    MessageBox(NULL,"String","Sample Code", NULL);   
    return 0L;   
}   

def 文件:

LIBRARY "Gpib-32"
EXPORTS   
ibask32

现在是 VB 应用程序:

以下是启动Form1,Form_Load的全部内容

Option Explicit
 Private Sub Form_Load()
  Call ibask
 End Sub

以下是添加到项目中的BAS模块文件:

Option Explicit

Declare Function ibask32 Lib "Gpib-32.dll" Alias "ibask" () As Long

Sub ibask()

    Call ibask32   ' Note: This is the point of failure

End Sub

如果可以提供可行的解决方案,请提前致谢, 汤姆

【问题讨论】:

    标签: c++ vb6 dll


    【解决方案1】:

    据我所知,您所做的一切都是正确的。通过在 DLL 上运行 Dumpbin.exe /exports 来验证您的假设。这显示了导出函数的实际名称,它必须与 VB6 声明中的别名匹配。

    我能想到的唯一其他故障模式是 VB6 加载了错误的 DLL。如果要从 VB6 IDE 中使用它,它必须存在于 PATH 中列出的目录中。通过从命令行运行“where gpib-32.dll”进行验证。

    【讨论】:

    • 谢谢汉斯,问题已解决...现在可以正常工作了。感谢 Dumpbin /exports 课程确实让事情变得更加清晰。你上面说的“它必须匹配别名......”让我直截了当;这就是必须从 DLL 导出的内容。感谢您的及时回复。
    • @nash,听起来对我很有帮助。请不要忘记标记它,在我的帖子旁边打勾。
    • +1 很棒的答案。 @nashth,如果您还有任何问题,请查看 1996 年 Microsoft 关于编写可从 VB5 调用的 C 4.0 DLL 的建议。他们从未更新过文档,但我认为几乎所有建议都与 C 6.0VB6 相关。 vb.mvps.org/tips/vb5dll.asp
    • 感谢 Mark 将我指向 MS 的 vb5dll.asp,期待我接下来需要什么。