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としてビルドされています。
難しい方法はありますが、名前付きパイプが通常の方法です。 –
私はATL COMアプローチを使いました。 – KilloWatt