C++ Windows:从主进程和 CallWndProc 进程访问相同的变量

C++ Windows: Access same variable from main process and CallWndProc process

本文关键字:进程 访问 变量 CallWndProc Windows C++      更新时间:2023-10-16

我有一个单文件 DLL,它接收_bstr_t并将其存储为全局变量,然后为WH_CALLWNDPROC过程设置一个 Windows 钩子。

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 由 Java 使用 JNI 调用。
  • DLL
  • 是作为多线程 DLL 构建的。

我使用了ATL COM方法作为全局值存储。 不是我理想的解决方案,但可行的解决方案。

但是,我认为Hans Passant对这个问题的评论是一种更好的方法,因为它不需要运行单独的进程。