2009-07-29 18 views
1

いくつかのグローバルデータを持つC++ Win32 dllを作成しています。グローバルに定義されたstd :: mapがあり、dllには(書き込みロックを取得した後に)データをマップに書き出す関数がエクスポートされています。エクスポートされたdll関数からのdllのグローバルデータへのアクセス

私の問題は、私がdllMainの中から書き込み関数を呼び出すと、問題なく動作するということです。私は別のプログラムからDLLをロードし、グローバルマップにデータを書き込む関数を呼び出すときしかし、それは私に、このエラーを与える:

WindowsError: exception: access violation reading 0x00000008 

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

私はTDM-MinGW gcc 4.4.0コンパイラを使用しています。

EDIT: [OK]を、私は問題が何であるかを考え出し、およびヘルプみんなに感謝、しかし問題は、グローバル空間にマップを持つようにコンストラクタを発行したりできないことではありませんでしたが、中に問題ました私が使っているboost :: pythonです。私はそれをテストしたが、私はPythonまたはおそらく何かの中からdllを呼び出していたので、urllib2モジュールはdllにロードされていなかった。今私はそれを修正する方法を見なければならない。

+0

解決策としてこれに回答を記入し、受け入れることをお勧めします。そうすることで、質問が「回答済み」と文書化されます。どちらか、それとも最も有益だった既存の回答を受け入れるか。 – RBerteig

答えて

1

コードが呼び出されたときにstd::mapのコンストラクタがまだ実行されていないように見えます。 Win32 DLL内のグローバルな非PODの存続期間はかなり難しいですが、MinGWがそれをどう扱うのかは不明です。しかし、DLLをコンパイルする方法、独自の関数(DllMain?)をエントリポイントとして設定しているので、コンストラクタを呼び出すCRT初期化ルーチンがオーバーライドされる可能性があります。

+0

私は、DllMain(DLL_PROCESS_ATTACH)が呼び出される前に、dll内のすべてのグローバルオブジェクトが初期化されると読んでいます。デストラクタは、DllMain(DLL_PROCESS_DETACH)が呼び出された後に呼び出されます。だから私はそれが動作すると仮定し、これを前提にしてあまりにも多くのコードを書いた。しかし、それが動作していない場合は、グローバルポインタを作成し、DllMain内のマップを作成して破棄することは安全でしょうか? – Sahas

+0

私は、Dllがロードされているときに、DllMainのマップにデータを挿入しているので、std :: mapのコンストラクタが呼び出されていると確信していますが、ロードされると、それは動作しません。 – Sahas

+0

「別のプロセスから関数を呼び出す」とはどういう意味ですか? DLLは、使用されているプロセスに常にロードされます。 –

0

異なるプロセスには別々のアドレススペースがあるため、共有メモリを使用する必要があります。 私はあなたがstd :: map runningを取得しないと思います。 MapViewOfFile、CreateFileMapping、OpenFileMapping、そして普通の古いデータの使用をお勧めします。 Google/MSDNにお尋ねください。

+0

私が言及しているデータは、私が作成しているdllによってのみ必要/使用され、dllを使用するアプリケーションはデータにアクセスする必要はありません。関数にデータにアクセスさせる他の方法はありますか? – Sahas

+0

おそらく、プロセスの1つをデータの所有者に定義できますか?そして:キーと値はシリアル化可能ですか?次に、プロセス間通信の手段を使用することができます。他のプロセスがマップをあまり使わない場合、これは問題ありません。 –

1

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

関連する問題