2011-12-09 10 views
0

Windowsアプリケーションに読み込まれるDLLは、エントリポイント(DLLMain())とそこから呼び出せる他の関数で構成されています。では、このDLLに接続するすべてのプロセスとスレッドに対して、これらの関数の中で変数をグローバルにする方法はありますか?Windows DLLのグローバル変数

現在、関数の1つが呼び出されるたびにファイルを開く/閉じる必要があります。これらの関数は非常に頻繁に呼び出されるため、毎回ファイルを開閉する実際のパフォーマンスの問題です。

wofstream wofstr; 

int WINAPI func(LPCWSTR lpString) 
{ 
    ... 
    //wofstr.open(...); 
    wofstr << lpString << endl; // *** NOT working without opening in this very function 
    ... 
    //wofstr.close(...); 
    ... 
} 

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) 
{ 
    ... 
    case DLL_PROCESS_ATTACH: 
     wofstr.open(...); // *** NOT seen in function above 
    ... 
    case DLL_THREAD_ATTACH: 
    ... 
    case DLL_THREAD_DETACH: 
    ... 
    case DLL_PROCESS_DETACH: 
     wofstr.close(...) 
    ... 
} 

私はここで何が欠けていますか?スレッドについてはどうですか?

+0

オンデマンドで、つまり初めて使用する必要があるときに、それを開いてみませんか?その後、DLLがアンロードされたら閉じます。定期的に出力バッファをフラッシュする必要があるかもしれません。 –

+0

あなたは何を意味するのかよく分かりません。私は上記の例を明確にしました。 – Marki

+0

誰もそれを使用したいと思う最初のときに、私はそのファイルを一度だけ開くことを意味する。遅延初期化パターンを使用します。 –

答えて

0

Windows DLLの各グローバル変数には、DLLをロードするプロセスごとに1つのインスタンスがあります。プロセスとグローバル変数インスタンスの間には1対1のマッピングがあります。プロセスは互いに完全に分離されており、1つのプロセスが異なるプロセスで直接メモリにアクセスすることはできません。

プロセス間で変数を共有する場合は、プロセス間通信(IPC)が必要です。たとえば、DLLがメッセージを送信できるロギングアプリを設定できます。

+0

だから、上の例のファイルは、DllMain()が呼び出されるたびに開かれていても、上のfunc()関数で開いているように見えませんか? – Marki

+0

それは答えが上記のコードから識別できない別の質問です。何か他のことが起こっているに違いありません。 –

+0

Like ...........? – Marki