1

いくつかのグローバルデータを使用してC++Win32dllを作成しています。グローバルに定義されたstd::mapがあり、データをマップに書き込むエクスポートされた関数がdllにあります(もちろん、書き込みロックを取得した後)。

私の問題は、dll DllMain内から書き込み関数を呼び出すと、問題なく動作することです。しかし、別のプログラムからdllをロードし、データをグローバルマップに書き込む関数を呼び出すと、次のエラーが発生します。

WindowsError: exception: access violation reading 0x00000008

これについて何かできることはありますか?DllMainから呼び出された場合、同じ関数はdll内のグローバルデータにアクセスできますが、別のプロセスから呼び出された場合、グローバルデータにアクセスできません。ご意見をお聞かせください。

TDM-MinGWgcc4.4.0コンパイラを使用しています。

編集: わかりました、私は問題が何であるかを理解しました、そして助けてくれた人に感謝します、しかし問題はコンストラクターの問題やグローバル空間にマップを持つことができないことではなく、私がブースト::pythonの問題でした使用しています。テストしましたが、Pythonなどからdllを呼び出していたため、urllib2モジュールがdllに読み込まれていませんでした。今、私はそれを修正する方法を見る必要があります。

4

3 に答える 3

1

コードが呼び出されたときに、コンストラクタがstd::mapまだ実行されていないようです。Win32 DLL 内のグローバルな非 POD の有効期間はかなりトリッキーで、MinGW が具体的にどのように処理するかについては確信が持てません。しかし、DLL をコンパイルする方法で、独自の関数 ( DllMain?) をエントリ ポイントとして設定し、コンストラクターを呼び出す CRT 初期化ルーチンをオーバーライドした可能性があります。

于 2009-07-29T09:07:05.303 に答える
1

このような低いメモリ アドレスでの読み取りエラーは、通常、どこかで NULL ポインターにアクセスしようとしていることを意味します。実際のコードを表示できますか?

于 2009-07-30T01:47:07.010 に答える
0

プロセスごとにアドレス空間が異なるため、共有メモリを使用する必要があります。std::map を実行できないと思います。MapViewOfFile、CreateFileMapping、OpenFileMapping、...、および単純な古いデータを使用することをお勧めします。Google / MSDN に問い合わせてください。

于 2009-07-29T09:07:34.087 に答える