Excel 不会从 C++ DLL 加载函数

Posted

技术标签:

【中文标题】Excel 不会从 C++ DLL 加载函数【英文标题】:Excel won't load function from C++ DLL 【发布时间】:2012-07-09 22:15:10 【问题描述】:

大家下午好。

我今天在玩 Excel 和 VBA 加载一些 DLL,看看我会遇到什么样的麻烦。

我制作了自己的非常简单的 DLL 来尝试一下。我一辈子都想不通为什么,但是当我尝试运行时,我不断收到“找不到指定的 DLL 函数”消息。

这是我的工作簿中的内容...

    Private Declare Sub MouseClick Lib "\location\of\myDLL" Alias "_MouseClick" ()
    'I have also tried...
    'Private Declare Sub MouseClick Lib "\location\of\myDLL" ()

    Sub Test()
            MouseClick
    End Sub

这是我在 DLL 中的简单函数声明...

    extern "C" 
    
            void MouseClick();
            ...
    

我想可能是我的函数名在编译时被弄错了,所以我用'nm'来检查...

    $ nm myDLL.dll | grep MouseClick
    6df81254 T _MouseClick

    $ nm -C myDLL.dll | grep MouseClick
    6df81254 T MouseClick

我不明白...我已经使用了这两种方法来尝试使其正常工作。 另外,我反汇编了一个使用 gdb 调用 MouseClick 函数的函数...

    $ gdb myDll.dll
    (gdb) disass testFunction
    Dump of assembler code for function testFunction:
       0x6df81327 <+0>:     push   %ebp
       0x6df81328 <+1>:     mov    %esp,%ebp
                       ...
       0x6df81361 <+58>:    call   0x6df81a44 <SetCursorPos@8>
       0x6df81366 <+63>:    sub    $0x8,%esp
    -> 0x6df81369 <+66>:    call   0x6df81254 <MouseClick>
       0x6df8136e <+71>:    jmp    0x6df8138a <testFunction+99>
                       ...
       0x6df8138a <+99>:    leave
       0x6df8138b <+100>:   ret
    End of assembler dump.

在这里,该功能也称为“MouseClick”。

我可能走错了路,但我不明白为什么 gdb 和 nm 都显示“干净”的函数名称,但 Excel 不能与我认为的任何一个一起工作.我确实让 dll 与我的 VBA 子一起工作了一段时间,但我更改了文档,现在它不起作用。

以前做过这件事的人会好心地为我指出这一切的正确方向吗?我应该在 Excel 中给函数起什么名字?为什么 nm 显示未损坏的函数名称?我是否以正确的方式解决这个问题?

提前感谢大家!

【问题讨论】:

【参考方案1】:

有人已经完成了所有这些并更新了他的问题以包含解决方案:

Compile a DLL in C/C++, then call it from another program

答案是特定于 gcc 的,这就是你似乎使用的。

【讨论】:

谢谢!你为我指明了正确的方向。我错过了一个编译器语句。对于其他与我有同样问题的人,另请参阅...MinGW VB DLL 和mingw sampleDLL。 示例语句: 'g++ myDLL.cpp -o myDLL.dll -Wl,--add-stdcall-alias -mdll'

以上是关于Excel 不会从 C++ DLL 加载函数的主要内容,如果未能解决你的问题,请参考以下文章

尝试调试调用 C++ DLL 的 VBA,“未加载 wntdll.pdb”

C++ 函数挂钩

java加载dll文件

.NET Core 应用程序无法加载 C++ DLL

如何从 C++ 调用 VB.NET DLL(也调用函数 - 不仅仅是 DLL 文件)

如何在 C++ 中从 dll(dll 中的构造函数)创建一些类?