gpt4 book ai didi

c - 如何使用 WM_COPYDATA 在使用 JNI 的 Java 程序之间发送字符串?

转载 作者:行者123 更新时间:2023-11-30 15:07:06 30 4
gpt4 key购买 nike

我想使用 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/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com