2

私は自分の仕事で次の問題に直面しました: MFC .dll と MFC .exe の 2 つのプロジェクトが同じソース コード (もちろんエントリ ポイントを除く) に基づいているため、同じデータを処理すると、それらによって異なる結果が生成されることがわかります。両方のすべてのプロジェクト設定を確認したところ、すべてのプロジェクト プロパティが類似していることがわかりました (少なくとも重要だと思われるものは)。いくつかのテストを実行した後、次のことを学びました。

  1. MFC .exe は、「デバッグ」モードと「リリース」モードの両方で同じデータセットに対して同じ結果を生成します
  2. MFC .dll は、「デバッグ」モードと「リリース」モードで同じデータセットに対して異なる結果を生成します
  3. .dll の「リリース」結果は、.dll の「デバッグ」結果とも、.exe の「デバッグ」または「リリース」結果とも一致しません。

.exe は、両方のコンパイラ構成で同じ結果が得られるという理由だけで正しく動作すると思いますが、これを確認することはできません。では、この .dll 'Release' 構成の問題はどのように解決できるのでしょうか? つまり、どうすればそれを他のものと一致させることができますか? そのような行動を説明するものは何ですか?

編集

Delphi で書かれたホスト アプリケーションを使用しているため、問題が発生していると思われます。この提案をテストするために新しい C++ exe を作成したところ、間違いなく正常に動作することがわかりました。唯一の違いは、Delphi アプリケーションで使用する DLL を作成するときにextern "C"とマークしましたが、C++ アプリケーションの場合はexternだけを記述したことです。このトピックに関する別の議論の詳細については、こちらを参照してください。しかし、 "C"を使用せずにexternマークのみで DLL を使用しようとすると、Delphi アプリケーションで、関数のエントリ ポイントがそこに見つからないと報告されます。

4

2 に答える 2

1

各ホストの 8087 コントロール ワードの値を確認します。Microsoft C は、Delphi が使用する値とは異なる値を使用していると確信しています。最近の Delphi バージョンでは、Set8087CW などの関数と、SetPrecisionMode や SetRoundMode などのラッパーがあります。しかし、DLL でそれらを具体的に設定し、計算の最後にそれらを元に戻すことをお勧めします。

于 2012-06-20T16:56:35.840 に答える
0

いくつかのコード例がなければ、これに答えるのは困難です。ただし、考慮すべき点の 1 つは、データ処理コードが、プロセッサを呼び出すコードでも使用されるグローバル データ構造を使用しているかどうかです。

DLL は独自のアドレス空間を作成し、デフォルトでグローバル データ構造の異なるセットにアクセスする場合があります。

メイン コードと処理コードで使用される結果を集計するために使用するグローバル テーブルがあるとします。

すべてが 1 つの exe に含まれているバージョンでは、両方が同じテーブルを使用します。dll バージョンでは、処理中の dll は 1 つのグローバル セットを使用し、それにリンクする exe は別のバージョンを使用します。

于 2012-06-19T16:16:06.353 に答える