エクスポートされた DLL 関数から DLL 内のグローバル データにアクセスする
質問
いくつかのグローバル データを含む C++ Win32 DLL を作成しています。グローバルに定義された std::map があり、dll にはマップにデータを書き込むエクスポートされた関数があります (もちろん、書き込みロックを取得した後)。
私の問題は、dll DllMain 内から書き込み関数を呼び出すと、問題なく動作することです。しかし、別のプログラムから DLL をロードし、グローバル マップにデータを書き込む関数を呼び出すと、次のエラーが発生します。
WindowsError: exception: access violation reading 0x00000008
これについて何かできることはありますか?同じ関数は、DllMain から呼び出された場合は dll 内のグローバル データにアクセスできますが、別のプロセスから呼び出された場合はグローバル データにアクセスできません。ご意見をお聞かせください。
TDM-MinGW gcc 4.4.0 コンパイラを使用しています。
編集:OK、問題が何であるかを理解しました。助けてくれた人たちに感謝します。しかし、問題はコンストラクターの問題やグローバル空間にマップを持てないことではなく、私が使用している boost::python の問題でした。を使用しています。テストしましたが、Python か何かから DLL を呼び出していたため、urllib2 モジュールが DLL にロードされませんでした。今、それを修正する方法を確認する必要があります。
解決
のコンストラクターのようです std::map
コードが呼び出されたときはまだ実行されていませんでした。Win32 DLL 内のグローバルな非 POD のライフタイムは非常に扱いにくく、MinGW がそれを具体的にどのように処理するかについてはわかりません。ただし、DLL をコンパイルする方法で独自の関数を設定している可能性があります (DllMain
?) をエントリ ポイントとして使用し、コンストラクターを呼び出す CRT 初期化ルーチンをオーバーライドします。
他のヒント
このような低いメモリ アドレスでの読み取りエラーは、通常、どこかの NULL ポインタにアクセスしようとしていることを意味します。実際のコードを見せてもらえますか?
異なるプロセスには個別のアドレス空間があるため、共有メモリを使用する必要があります。std::map は実行できないと思います。MapViewOfFile、CreateFileMapping、OpenFileMapping などを使用することをお勧めします。そして単純な古いデータ。Google/MSDN に問い合わせてください。