2009-05-31 32 views
0

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を入れてみましたが、これは何も変わりません。

答えて

2

呼び出し規約に問題があります。呼び出し先のコンベンションタグを適切な場所に配置していることを確認してください。 GCCで、それは次のようになります(それらを得ることが右が重要ですが)あなたの問題は呼び出し規約とは何の関係もないように

typedef int (__stdcall *MyFunctionType)(int arg1, const char *arg2); 
MyFunctionType myFunction = (MyFunctionType)GetProcAddress(myModule, "MyFunction"); 
// check for errors... 
int x = myFunction(3, "hello, world!"); 

[EDIT]は

が見えます。あなたは誤ってBSTRの - BSTRではない単純なchar*ポインタです。これはUnicode文字列(wchar_t*)へのポインタであり、さらに文字列の最初の文字の前に4バイトの長さのプレフィックスが隠されています。詳細はMSDNを参照してください。したがって、SetLicense()への電話は、次のようになります。

BSTR User = SysAllocString(L""); // Not sure if you can use the same object here, 
BSTR Key = SysAllocString(L""); // that depends on if SetLicense() modifies its 
            // arguments; using separate objects to be safe 
// check for errors, although it's pretty unlikely 
(textCapLib.sdk)->lpVtbl->SetLicense((textCapLib.sdk), User, Key); 
SysFreeString(User); // Hopefully the SDK doesn't hang on to pointers to these 
SysFreeString(Key); // strings; if it does, you may have to wait until later to 
         // free them 
+0

お返事ありがとうございます。残念なことに、それはまさにCヘッダーファイルのようです。 VC++でコードがコンパイルされる方法と、GCCでコードがコンパイルされる方法との間に大きな違いがありますか?スタックの整列、または...? ちょうどメモ;ライブラリヘッダーファイルで、ライブラリのコンパイル時の設定を以下に示します。Oicf、W1、Zp8、env = Win32(32b run) __declspec(uuid())、__declspec(selectany)、__declspec(novtable) ) DECLSPEC_UUID()、MIDL_INTERFACE() それが何かと関係があるかどうかはわかりません。 –

+0

ヘッダファイルと呼び出しコードの関連部分を含め、使用しているコードを投稿できますか? –

+0

確かに。ライブラリのヘッダーファイルをhttp://pastebin.com/m2d66c18cに貼り付けました。私はここに例を貼り付けました(Cで):http://pastebin.com/m564b3181。 GCCでCインターフェイスを使用しています。関連するコードは、ヘッダーファイルの810行目から始まります。 私はWin32 API関数をうまく呼び出すことができます。ヘッダファイルによれば、ライブラリ関数はWINAPI関数(STDMETHODCALLTYPE/WINAPI == __stdcall)と同じ呼び出し規約に従います。 –

関連する問題