问题 - TCHAR作为LPARAM到属于另一个进程/线程的窗口

时间:2011-01-04 03:55:22

标签: c++ windows winapi dll hook

所以我正在通过c book示例播放/实现与windows的关系,并且有一些关于dll注入的部分令人难以置信,我无法解决它。

我创建了一个属于另一个线程/进程的对话框,我试图将它发送给TCHAR变量,以便它可以在某个函数中使用该var(函数和tchar都在同一个dll文件中)

因此,当创建对话框并在另一个线程中保持良好状态时,我会向其发送消息。

首先我声明tchar

TCHAR finalpath[MAX_PATH];

然后我只用信息填充它(我在dll线程中执行此操作,而不是在对话框的线程中,让我也提到我必须在dll线程中执行此操作,因为这只能填充所需的tchar(i)我需要获取dll工作目录并填写tchar))

所以,当我在我的tchar中获取此信息时,我正在尝试向对话框发送消息并使用tchar作为LPARAM(wparam是hwnd btw)

SendMessage(hWndDIPS, WM_APP, (WPARAM) lista, (LPARAM)finalpath); 

之后我在另一个线程对话程序循环中做基本的功课...

INT_PTR WINAPI Dlg_Proc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam) {

   switch (uMsg) {
      chHANDLE_DLGMSG(hWnd, WM_CLOSE, Dlg_OnClose);

      case WM_APP:


  SaveListViewItemPositions((HWND) wParam, (TCHAR)lParam);
         break;
   }

   return(FALSE);
}

应该接收参数的函数(此函数驻留在共享dll中,并且如上所述由过程调用,定义如下..

void SaveListViewItemPositions(HWND hWndLV,TCHAR sejv []){ ...}

我从中得到的编译错误是

Error 7 error C2664: 'SaveListViewItemPositions' : cannot convert parameter 2 from 'TCHAR' to 'TCHAR []'

所以我不知道为什么会这样。如果tchar是数组,那么我需要在[]添加的参数中使用它,因为数据如何在参数中使用(更不用说如果我不这样做它会给我更多的错误,我不能在函数中使用参数)< / p>

那为什么不转换呢?

如果有另一个解决方案让此对话框接收tchar var,请解释。

由于

2 个答案:

答案 0 :(得分:5)

即使您修复了类型声明并将LPARAM正确地投射到TCHAR*之后,您的代码仍然不正确。传入该窗口过程的'参数'是一个指针,并且作为任何指针,仅在进程地址空间内有效。接收器窗口必须使用ReadProcessMemory并将进程中的字符串复制到自己的进程中。当然,这意味着接收方进程知道您的进程ID,并具有能够从您的内存中读取的适当权限。而且你还需要传入字符串的长度,因为ReadProcessMemory无法猜测NULL终止符的位置(尽管我认为MAX_PATH最大长度,这不是一个严重的问题)。

所以你是对的,这是一个令人头痛的问题,而且更是如此。特权问题可能是一个表演者。

您可以使用几种IPC机制。一个简单的是匿名命名管道,请参阅Anonymous Pipe Operations。共享内存是另一种内容,请参阅Using Shared Memory in a Dynamic-Link Library。 COM也可以工作(让你“控制”的过程创建一个托管在你的进程服务器中的类的实例,让COM编组完成其余的工作,参见Marshaling Details)。或者您可以在进程边界之间手动编组COM接口(请参阅CoMarshalInterface)。

答案 1 :(得分:1)

我认为您的问题是您将LPARAM类型转换为TCHAR而不是TCHAR数组(TCHAR *)。尝试更改它,看看它是否能解决问题。