2017-08-04 17 views
1

グローバル変数として_bstr_tを受信して​​格納する単一ファイルDLLを持っていて、WH_CALLWNDPROCプロシージャのWindowsフックを設定します。C++ Windows:メインプロセスとCallWndProcプロセスから同じ変数にアクセス

CallWndProcの機能では、_bstr_tの読み取りを試みますが、値はありません。

私は両方の機能から変数のアドレスを印刷しましたが、それらは異なっています。

CallWndProc関数が別のプロセスのスレッドで呼び出されたと思うので、これは驚くべきことではありません。

私の質問は、それらの間で変数を共有する最も簡単で最良の方法は何ですか?

私はATL COMをプロセス間アクセスのために格納するのを避けようとしています。

例コード:

// foo.cpp 
#include <comutil.h> 

static HHOOK g_hook = NULL; 
static _bstr_t shared = ""; 

static LRESULT WINAPI CallWndProc(int nHookCode, WPARAM wParam, LPARAM lParam) { 
    if (nHookCode == 12345) { 
     // Do something with '_bstr_t shared' 
     shared += " bar"; 
     return 0; 
    } 
    return CallNextHookEx(g_hook, nHookCode, wParam, lParam); 
} 

extern "C" __declspec(dllexport) void _stdcall Do(char* someStr, long handle) { 
    shared = someStr; 

    DWORD threadId = GetWindowThreadProcessId((HWND) handle, &process); 
    HINSTANCE hInst = GetModuleHandle("foo.dll"); 
    g_hook = SetWindowsHookEx(WH_CALLWNDPROC, CallWndProc, hInst, thread); 

    // Check value of '_bstr_t shared', or call a COM function to store it somewhere. 
    // However, the value of 'shared' does not include the string appended in CallWndProc. 
} 

追加情報:

  • DLLは、JNIを使​​用してJavaで呼ばれます。
  • DLLはマルチスレッドDLLとしてビルドされています。
+2

難しい方法はありますが、名前付きパイプが通常の方法です。 –

+0

私はATL COMアプローチを使いました。 – KilloWatt

答えて

0

私は値のグローバルストアとして動作するようにATL COMアプローチを使いました。 私の理想的な解決策ではなく、実行可能な解決策です。

しかし、Hans Passantの質問に対するコメントは、別のプロセスを実行する必要がないため、より良い方法ですと思います。

関連する問題