使用WM_COPYDATA在使用JNI的Java应用程序之间发送String消息

时间:2016-07-19 06:27:13

标签: java c winapi

我想使用Array ( [0] => 0 [1] => 2 [2] => 1 ) 在Windows应用程序之间发送一个简单的字符串消息(Windows的数据复制IPC机制)。我正在使用JNI在C中编写WinAPI代码。

在这个阶段,我只是简单地在接收应用程序中打印出消息。目前,它只打印出 null 。我怀疑是因为WM_COPYDATA没有被初始化。但我不知道如何使用lParamlParam中提取数据。

非常感谢任何建议的解决方案。正如您所见,我是WinAPI的新手。

我目前有以下代码:

发送代码:

COPYDATASTRUCT

接收代码:

HWND hwnd = 0;
LPCTSTR lpszString = "A message";
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(TCHAR) * (_tcslen(lpszString) + 1);
cds.lpData = (TCHAR*)lpszString;
SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
return 0; // success

1 个答案:

答案 0 :(得分:2)

您正在发送一个值为0的窗口句柄。您必须提供一个有效的窗口句柄而0不是。

其他一些评论:

  • 您表面上使用TCHAR,但您的代码只能编译为ANSI。除非您以Windows 98为目标,否则请勿使用TCHAR。使用Unicode。
  • 您不应该假设接收时数据为空终止。确保复制不超过cbSize个字节。如果发件人不是您期望的,这可以防止缓冲区溢出。
  • 通常会将dwData视为验证发件人是否符合您预期的方法。
  • 同样,您通常会将发件人窗口作为wParam而不是收件人传递。
  • if (WM_COPYDATA)毫无意义。条件在编译时计算为true。

查看您的代码,您创建任何窗口都不是很明显。您需要一个窗口来接收消息。也许这是你问题的根源。由于您没有提供MCVE,因此很难更精确。