0

こんにちは、みなさん。

私は今日、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 subで動作させることができましたが、ドキュメントを変更したため、動作しなくなりました。

以前にこれを行ったことがある人は、これについて正しい方向に私を向けるのに十分親切でしょうか?Excelで関数に名前を付ける必要がありますか?nmがマングルされていない関数名を表示しているのはなぜですか?私もこれを正しい方法で行っていますか?

よろしくお願いします!

4

1 に答える 1

1

誰かがすでにこれらすべてを経験し、解決策を含めるために彼の質問を更新しました:

DLLをC/C ++でコンパイルし、別のプログラムから呼び出します

答えは、あなたが使用しているように見えるgccに固有のものです。

于 2012-07-09T22:43:57.273 に答える