【问题标题】:Problem - TCHAR as LPARAM to a window that belongs to another process/thread问题 - TCHAR 作为 LPARAM 到属于另一个进程/线程的窗口
【发布时间】:2011-01-04 03:55:21
【问题描述】:

所以我正在通过 c 书籍示例使用 windows 玩/实现tomyown,并且有一些关于 dll 注入部分的东西让我感到困惑,我无法解决它。

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

因此,当创建对话框并很好地放置在另一个线程中时,我会向它发送一条消息。

首先我声明 tchar

TCHAR finalpath[MAX_PATH];

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

所以,当我在 tchar 中获取此信息时,我试图向对话框发送消息并将 tchar 用作 LPARAM(wparam is 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 是数组,那么我需要在参数中使用它并添加 [],因为这就是在参数中使用数组的方式(更不用说,如果我不这样做,它会给我更多错误,而且我无论如何都不能在函数中使用参数)

那么为什么它没有转换呢?

如果有其他解决方案可以使此对话框接收 tchar var,请解释一下。

谢谢

【问题讨论】:

  • 您试图通过简单地传递指针来跨进程边界发送数据?

标签: c++ windows winapi dll hook


【解决方案1】:

即使您修复了类型声明并将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)。

【讨论】:

  • 感谢您非常准确的解释,那么 wm_copydata 呢?我认为这可能是最简单的事情。
  • @Marko29:如果您控制两个进程的代码,并且您正在使用窗口消息,那么 WM_COPYDATA 确实可能是复制一个小的、简单的缓冲区(如字符串)的最佳方法从一个过程到另一个过程。请记住,如果您使用 TCHAR,它可能在每个进程中都意味着不同的事情,除非您小心地将两者编译为彼此一致的 Unicode 或 ANSI。 (无论缓冲区是 Unicode 还是 ANSI,您可能希望将发送者标志发送给接收者,并让接收者在需要时进行转换。或者无论 TCHAR 是什么,都始终发送 Unicode。)
  • @Marko29:我什至不知道WM_COPYDATA实际上存在。
  • 我用 wm_copydata 解决了这个问题,由于某种原因,到目前为止,字符串是唯一让我不喜欢 winapi 的东西。我遇到了很多转换和兼容性问题
  • 但这就是当我对原始 C 没有任何线索并深入研究它时得到的结果
【解决方案2】:

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

【讨论】:

  • 这解决了转换问题,但由于某种该死的原因,我通过的 tchar 变量为空,我通过测试它
  • _tfreopen(_T("C:/sometext.txt"),_T("w"),stdout); wprintf(L"%s, ", sejv); fclose(标准输出);知道如何将变量传递给属于另一个线程的对话框吗?我想知道为什么我可以通过 hwnd 而不是 tchar
  • 对不起...我对 Win32 中的进程间通信不太熟悉。 :-(
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-19
  • 1970-01-01
  • 1970-01-01
  • 2015-09-25
相关资源
最近更新 更多