我写了一个查找窗口的dll,根据参数传入窗口的名字,但有下面的问题:
static TCHAR wndName[MAX_SIZE];
void FindWnd(TCHAR str[MAX_SIZE])
{
strcpy(wndName,str);
wndShook=SetWindowsHookEx(WH_CBT,(HOOKPROC)CBTProc,(HINSTANCE)hook,NULL);
wndmsghook=SetWindowsHookEx(WH_GETMESSAGE,(HOOKPROC)GetMsgProc,(HINSTANCE) Dllhook,NULL);
}
static LRESULT CALLBACK CBTProc(int nCode, WPARAM wParam, LPARAM lParam)
{
switch (nCode)
{
case HCBT_ACTIVATE:
EnumWindows(EnumWindowsProc,0);
break;
}
return CallNextHookEx(RTGShook,nCode,wParam,lParam);
}
static BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
TCHAR wndTitle[MAX_SIZE];
GetWindowText(hwnd,wndTitle,MAX_SIZE);   
if (!strcmp(wndTitle,wndName))     
{
..............................
return FALSE;
}return TRUE;
}
strcmp(wndTitle,wndName)这句永远都不成功,我曾跟踪过发现wndName的值并不是我最初送的值,而是空的,这是为什么呢?
请各位大虾帮我解答一下。

解决方案 »

  1.   

    我猜想这是因为两者不在相同的进程中。
    FindWnd函数是位于进程A中,而两个Callback函数是位于进程B中。因此尽管你使用的是一个全局变量,但是这个全局变量在进程A和B中各有一个实例,因此无法传值。
      

  2.   

    我也曾经想过,也试过将Callback函数中的wndName的地址和内容写到文件中,的确发现有些地址是不同的,但也有地址相同的时候,可是内容却为空这又是为什么呢?如何可以实现上述的参数传递呢?
      

  3.   

    wndName
    设置成共享数据端?
      

  4.   

    Dreamer7901() 说的对。
    因为FindWnd函数处理的是位于调用FindWnd函数的进程内的DLL的全局变量。
    而钩子里面处理的是加载到另一个进程内的DLL的全局变量。有可能两个DLL都加载到了进程的同一基址上,这时两个变量虚拟地址相同,但是实际上指向不同的物理存储页面,Window加载DLL会保证这一点。不过你可以在编译时指定需要在不同进程间共享的全局变量;#pragma data_seg("Shared")   //可以是任意名字
    static TCHAR wndName[MAX_SIZE];
    #pragma data_seg()__declspec(allocate("Shared")) static TCHAR wndName = { 0 };#pragma comment(linker,"/SECTION:Shared,RWS")
      

  5.   

    我想是因为你对静态字符数组wndName赋值的方式不对把
    你是怎么赋值的?
      

  6.   

    Dreamer7901()所说的在DEF文件中如何定义呢?