- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想使用 Windows 数据复制 (WM_COPYDATA
)、使用 native C 代码和 JNI 共享库在 Java 程序之间发送一个简单的字符串值。本质上,想要启动通信的 Java 程序可以调用 native 方法,该方法将设置一个仅消息窗口,另一个 Java 程序也可以通过调用 native 方法(存在于同一共享库中)来从中获取消息。
我知道我没有消息循环,而且我不知道如何实现它。我在网上看到过使用 WndProc
回调函数的示例,但我不知道这是否是合适的方法,因为这是一个仅包含消息的窗口(即, self 的 Java 应用程序控制台以来,没有可见的 UI)基于。
任何有关代码的帮助将不胜感激。
设置:
JNIEXPORT jint JNICALL Java_WindowsIPC_openDataCopy
(JNIEnv * env, jobject obj, jstring message) {
MSG msg;
WNDCLASS WndClass;
memset(&WndClass, 0, sizeof(WndClass));
WndClass.lpfnWndProc = &DefWindowProc;
WndClass.lpszClassName = L"Class";
WndClass.hInstance = GetModuleHandle(NULL);
HWND hwnd;
LPCTSTR messageString = "A message";
if (!RegisterClass(&WndClass)) {
printf("failed to register class: %d\n", GetLastError());
return -1;
}
hwnd = CreateWindowEx(0, WndClass.lpszClassName, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
if (hwnd == NULL) {
printf("Window Creation failed: %d\n", GetLastError());
return -1;
}
while (GetMessage (&msg, NULL, 0, 0) > 0) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0; // success
}
尝试获取消息:
JNIEXPORT jint JNICALL Java_WindowsIPC_getDataCopyMessage
(JNIEnv * env, jobject obj) {
HWND hwnd;
hwnd = FindWindowEx (
HWND_MESSAGE,
0,
0,
0
);
LPCTSTR messageString = "A message";
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(char) * (strlen(messageString) + 1);
cds.lpData = (char*)messageString;
if (hwnd == NULL) {
printf("Couldnt find window: %d\n", GetLastError());
return -1;
} else SendMessage(hwnd, WM_COPYDATA, (WPARAM)hwnd, (LPARAM)(LPVOID)&cds);
LPARAM lParam;
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*)lParam;
LPCTSTR lpszString = (LPCTSTR)(pcds->lpData);
printf("%s\n", lpszString);
return 0; // success
}
最佳答案
您并不是要求 FindWindowEx()
定位 Java_WindowsIPC_openDataCopy()
创建的特定 HWND_MESSAGE
窗口。您要求它找到第一个可用 HWND_MESSAGE
窗口,该窗口可能属于任何人。您需要在 lpszClass
参数中指定所需的类名称。
此外,您应该使用比“Class”更独特的类名称
。
在接收端,不要将 DefWindowProc()
本身用于 lpfnWndProc
。您需要定义自己的 windowproc 函数。然后您就可以实际处理收到的 WM_COPYDATA
消息。将所有未处理的消息传递给 DefWindowProc()
。
尝试更多类似这样的事情:
LRESULT WINAPI MyWindowProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)
{
if (Msg == WM_COPYDATA)
{
COPYDATASTRUCT* pcds = (COPYDATASTRUCT*) lParam;
if (pcds->dwData == 1)
{
LPCSTR lpszString = (LPCSTR) (pcds->lpData);
printf("%.*s\n", lpszString, pcds->cbData);
return TRUE;
}
}
return DefWindowProc(hWnd, Msg, wParam, lParam);
}
JNIEXPORT jint JNICALL Java_WindowsIPC_openDataCopy
(JNIEnv * env, jobject obj, jstring message)
{
WNDCLASS WndClass;
memset(&WndClass, 0, sizeof(WndClass));
WndClass.lpfnWndProc = &MyWindowProc;
WndClass.lpszClassName = TEXT("MyWindowsIPCClass");
WndClass.hInstance = GetModuleHandle(NULL);
if (!RegisterClass(&WndClass)) {
printf("failed to register class: %d\n", GetLastError());
return -1;
}
HWND hwnd = CreateWindowEx(0, WndClass.lpszClassName, NULL, 0, 0, 0, 0, 0, HWND_MESSAGE, NULL, NULL, NULL);
if (hwnd == NULL) {
printf("Window Creation failed: %d\n", GetLastError());
return -1;
}
MSG msg;
while (GetMessage (&msg, NULL, 0, 0)) {
TranslateMessage (&msg);
DispatchMessage (&msg);
}
return 0; // success
}
JNIEXPORT jint JNICALL Java_WindowsIPC_sendDataCopyMessage
(JNIEnv * env, jobject obj)
{
HWND hwnd = FindWindowEx (HWND_MESSAGE, 0, TEXT("MyWindowsIPCClass"), 0);
if (hwnd == NULL) {
printf("Couldnt find window: %d\n", GetLastError());
return -1;
}
LPCSTR messageString = "A message";
COPYDATASTRUCT cds;
cds.dwData = 1;
cds.cbData = sizeof(char) * (strlen(messageString) + 1);
cds.lpData = messageString;
if (SendMessage(hwnd, WM_COPYDATA, 0, (LPARAM)&cds) != TRUE) {
printf("Couldnt send message\n");
return -1;
}
return 0; // success
}
关于c - 如何使用 WM_COPYDATA 在使用 JNI 的 Java 程序之间发送字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38527071/
我正在尝试在 Delphi 2010 中的两个应用程序之间传递信息。 我正在使用过去成功使用过的代码的简化版本(简化是因为我不需要发件人知道发送已成功)我已将收到的发送归结为一对示例应用程序,其本质如
我尝试使用 WM_COPYDATA 将字符串从一个窗口发送到另一个窗口。我的接收窗口完美地接收了消息。除了我发送的字符串不完整。 这是我在发送应用程序中的代码: HWND wndsend = 0;
我必须在两个应用程序之间实现一个WM_COPYDATA IPC。我在互联网上有一些示例,但它们都只发送少于 255 个字符的字符串。 我想使用 WM_COPYDATA 将一个大字符串(超过 1k)发送
使用 WM_COPYDATA 将命令行参数传递到 Delphi XE 的另一个应用程序实例,如下所示: function DAppInstance.SendParamsToPrevInstance(A
如何将我的结构发送到其他应用程序并使用 WM_COPYDATA 消息接收它? 最佳答案 MS 在 Using Data Copy 解释了其中的大部分内容. 该示例中是否缺少任何内容? 关于c++ -
我正在尝试通过 WM_COPYDATA 消息实现进程间通信。 COPYDATASTRUCT 的 lpData 成员不能包含指针。我的问题是,char 数组与其他数组或 vector 有什么区别。 当我
第一次在这里发帖。 我用 borland c++ 构建了一个小应用程序,它由商业第三方应用程序通过 shell 命令执行。然后,第二个应用程序一直等到它从我的应用程序收到退出代码。我想要做的是通过发送
我正在尝试让 C# WPF 应用程序与另一个使用 WM_COPYDATA 以 C 编写的应用程序进行通信。 C 应用程序正在尝试发送一个结构,如下所示: typedef struct { in
我希望在进程之间发送文本。我发现了很多这样的例子,但没有一个我可以开始工作。这是我目前所拥有的: 对于发送部分: COPYDATASTRUCT CDS; CDS.dwData = 1; CDS.cbD
我正在尝试使用 WM_COPYDATA 将数据从一个应用程序发送到另一个应用程序。这两个应用程序都是控制台并且没有窗口。我可以很好地发送用户消息。当我尝试发送 WM_COPYDATA 并设置数据结构或
我想从 2 个 CONSOLE 应用程序(2 个没有表单的不同 PID!)发送/接收一个字符串。我看到我需要在类里面声明这个。是否可以在控制台应用程序中根本没有类的情况下执行此操作?如果可以,我该怎么
我正在尝试编写一个组件,通过 WM_COPYDATA 在应用程序之间发送字符串消息。我想捕获 WM_COPYDATA,但这不起作用: TMyMessage = class(TComponent) pr
我想发送一条记录,目前只有一个字符串,但我将添加更多变量。这是我第一次处理记录,所以这可能是一个愚蠢的问题。但是,为什么这有效: type TDataPipe = record Windo
我正在尝试使用 LabView 为我的系统执行数据采集,同时仍保持现有 C 程序正常运行。我希望通过使用 wm_copdata 命令并通过 dll 进行通信来实现这一点。 不幸的是,我发现的大多数执行
我正在尝试从 Python 读取 WM_COPYDATA 消息,一些应用程序(我正在尝试使用 Spotify)发送到 WindowsLiveMessenger 以更新“我正在收听的...”短语。 据我
目前我正在研究一个使用 WM_COPYDATA 将用户数据发送到其他进程的示例。我构造 COPYDATASTRUCT 结构来填充用户数据。并使用 SendMessage() 函数将数据发送到其他进程。
我已经花了几天(或更多)时间来尝试让它发挥作用。 手头的应用程序是 FTPRush,我知道有一个名为 rush_cmdline.exe 的命令行应用程序,它使用 SendMessage 发送请求到 F
我试图让 Delphi 应用程序通过 WM_COPYDATA 相互通信。我遇到的问题是发送方应用程序是用 Delphi 7 编写的,而接收方是用 Delphi 10.2 编写的。我将我的 Delphi
我正在使用 Visual Studio 2010 开发 4 个应用程序(使用互联网上已建立的示例):2 个在 C++ MFC 中(名为:SenderCpp 和 ReceiverCpp),2 个在 C#
如何创建将任何数据传递给不同程序的自定义 Windows 消息。 我在 GUI 程序和服务器程序之间进行消息传递。我的背景是 *nix 编程,但我有点迷失在 Windows 世界中。 目前这两个程序都
我是一名优秀的程序员,十分优秀!