GCCを使用してコンパイルされた私のプログラムからVisual C++をコンパイルしたDLLでいくつかの関数を呼び出そうとしています。GCCでVisual C++でコンパイルされたDLLを呼び出すときのスタックの問題
DLLの関数を呼び出すには、DLLでLoadLibrary()を実行してから、GetProcAddress()を呼び出して特定の関数のアドレスを取得します。この関数は、呼び出すDLL内の関数へのポインタのリストを返します。
これらの関数を呼び出そうとすると、正しく機能しません。プログラムをデバッガで走らせたところ、GCCがebp-24に入れたとしても、DLLライブラリ関数がebp + 8で渡された引数の1つを探しているように見えます。
これは間違いなくスタックの問題のようです。さらに、DLL関数を呼び出すGCCプログラム関数が復帰すると、私のプログラムがクラッシュするため、スタックで何かが起こっています。誰かがこれを解決するために何をする必要があるかを知っていますか? DLLコードにアクセスできません。
また、プログラムのソースファイルにDLL関数定義の前に__cdeclと__stdcallを入れてみましたが、これは何も変わりません。
お返事ありがとうございます。残念なことに、それはまさにCヘッダーファイルのようです。 VC++でコードがコンパイルされる方法と、GCCでコードがコンパイルされる方法との間に大きな違いがありますか?スタックの整列、または...? ちょうどメモ;ライブラリヘッダーファイルで、ライブラリのコンパイル時の設定を以下に示します。Oicf、W1、Zp8、env = Win32(32b run) __declspec(uuid())、__declspec(selectany)、__declspec(novtable) ) DECLSPEC_UUID()、MIDL_INTERFACE() それが何かと関係があるかどうかはわかりません。 –
ヘッダファイルと呼び出しコードの関連部分を含め、使用しているコードを投稿できますか? –
確かに。ライブラリのヘッダーファイルをhttp://pastebin.com/m2d66c18cに貼り付けました。私はここに例を貼り付けました(Cで):http://pastebin.com/m564b3181。 GCCでCインターフェイスを使用しています。関連するコードは、ヘッダーファイルの810行目から始まります。 私はWin32 API関数をうまく呼び出すことができます。ヘッダファイルによれば、ライブラリ関数はWINAPI関数(STDMETHODCALLTYPE/WINAPI == __stdcall)と同じ呼び出し規約に従います。 –