4

私は上級プロジェクト用のプログラミング学習ゲームを作成しており、Visual Studio 2008 C++ アプリケーションに動的にロードできる DLL をコンパイルできるコンパイラを探しています。

ここで重要な点は、コンパイラが再配布可能であるということです。VS が再配布可能であれば、それを使用します。

これまでのところ、MinGW を使用してある程度の成功を収めていますが、その成功には限界があります。現在、一度に 1 つの DLL のみをロードして動作させることができます。2 番目のものをロードしようとすると、VS C++ アプリがアクセス違反エラーでクラッシュします。

VS自体でコンパイルされた2つのDLLを問題なくロードできたので、それはMinGWに固有のものであり、DLLであり、それらがLoadLibrary()などとどのように相互作用するかであると信じるようになります。

私はかなり長い間この問題に取り組んできましたが、イライラしています。MinGW の代わりに動作することがわかっている別のコンパイラを誰かが知っている場合、またはこの問題を見たことがある場合は、おそらく 2 番目の DLL がクラッシュする理由を知っているでしょう。それぞれの DLL が何らかの方法で他の DLL を踏んでいることに関連していると確信していますが、それが何であるか、またはどのように見つけるかはわかりません。

DLL をコンパイルする方法またはロードする方法が原因である可能性があります。何も思いつきません。

フィードバックをいただければ幸いです。

編集: これらは、DLL http://pastebin.com/f675df4b0を作成するための g++ および dlltool への単純な呼び出しです。

これは、私の DLL の 1 つからのソースです。 http://pastebin.com/f5c062611

これは、DLL をロードするための私の C++ アプリのコードです。 http://pastebin.com/f52f94a18

-マイケル

4

2 に答える 2

1

Visual Studio Express を使用するだけで十分でしょうか? コンパイラは自由にダウンロードできるので、DLL の互換性を確保するための苦労を大幅に軽減できます。

要件がどれほど厳しいかはわかりませんが、Visual Studio Express のライセンス情報を確認すると、プロジェクトに対して十分に緩い可能性があります。

于 2010-02-17T22:22:17.077 に答える
0

DllMainから0を返しています。仕様によれば、問題が発生しない限り、TRUEを返す必要があります。ただし、これによってMSVCまたはMinGWで異なる動作が発生する理由がわかりません。また、DllMainがFALSEを返す場合、LoadLibraryは0を返す必要があるため、これは実際の説明ではない可能性があります。

DllMainは実際にはMSVCバージョンとMinGWバージョンの両方で呼び出されますか?メッセージボックス呼び出しのコメントを削除すると何かが起こりますか?

DllMainの詳細については、http://msdn.microsoft.com/en-us/library/ms682583(VS.85).aspxを確認してください。

2番目のdllをロードする前に最初のdllから実際にAiFunctionを呼び出す場合に、興味深いもう1つのことがあります。もしそうなら、間にdll関数を呼び出さずに両方のdllをロードしてみて、それがうまく機能するかどうかを確認できますか?

私の疑惑は、MinGWとMSVCが入力構造体または出力構造体を異なる方法でパックし、AiFunctionを呼び出すと、このサイズの不一致によって一部のメモリが破損することです。dllの内部と外部の出力と入力のsizeof()の結果を比較し、一致するかどうかを確認することで、これを健全性チェックできます。これはそれが正しいことを保証するものではありませんが、それが一致しない場合は、何かがうまくいかないことをかなり確信で​​きます。

最後に、仮想呼び出しなどを導入し始めると、MSVCとMinGW内でまったく同じ方法で実装されない可能性があるため、出力を返すことが長期的に問題になる可能性があるのではないかと心配しています。仮想関数などを使用せずに保持する場合は、構造のパッキングが一致する限り問題ありません。

于 2010-02-18T05:57:44.613 に答える