2017-08-04 40 views
1

我有一个单文件DLL接收并存储作为全局变量的_bstr_t,然后为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由Java中使用JNI调用。
  • DLL构建为多线程DLL。
+2

只有很难的方法,命名管道是通常的方法。 –

+0

我使用ATL COM方法。 – KilloWatt

回答

0

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

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