Java用JNA调用Windows的DLL时候出现一些问题:
DLL的主要作用是充当脚本,执行一些固定的动作:
在VC/MFC新建一个Demo,Demo是可以正常调用DLL的,DLL也能正常工作,能达到预期效果。
//1.先获得桌面窗口
CWnd* pDesktopWnd = CWnd::GetDesktopWindow();
//2.获得一个子窗口
CWnd* pWnd = pDesktopWnd->GetWindow(GW_CHILD);
//3.循环取得桌面下的所有子窗口
while (pWnd != NULL)
{
HWND hWnd[20];
//保存好上一个句柄
pWndLast = pWnd;
//获得窗口类名
::GetClassName(pWnd->GetSafeHwnd(), strClassName.GetBuffer(256), 256);
//获得窗口标题
::GetWindowText(pWnd->GetSafeHwnd(), strWindowText.GetBuffer(256), 256);
if (strWindowText == L"Initial Input")
{
strTemp.Format(L"句柄是:%0.8X,类名是: %s,窗口标题是: %s", pWnd->m_hWnd, strClassName, strWindowText);
strMsg = strTemp;
AfxMessageBox(strTemp);
pWndInitialInput = pWnd;
hWnd[1] = ::GetWindow(pWndInitialInput->m_hWnd, GW_CHILD);
hWnd[2] = ::GetWindow(hWnd[1], GW_HWNDNEXT);
hWnd[3] = ::GetWindow(hWnd[2], GW_HWNDNEXT);
hWnd[4] = ::GetWindow(hWnd[3], GW_HWNDNEXT);//需要填充的控件句柄
//填充文本
::SendMessage(hWnd[4], WM_SETTEXT, 0, (LPARAM&)(str));
Sleep(200);
//路径填充完成后,模拟点击按钮
::SendMessage(hWnd[2], WM_LBUTTONDOWN, 0, 0);
Sleep(200);
::SendMessage(hWnd[2], WM_LBUTTONUP, 0, 0);
Sleep(200);
break;
}
}
主要问题出现在Java的Demo通过JNA调用DLL的时候,就无法正常SendMessage。Java的Demo调用DLL是成功了的,AfxMessageBox是正常弹框了,就SendMessage没有效果:
public class AUTO {
public interface IAUTO extends Library {
//实例化DLL
IAUTO hDLL= Native.load("Auto.dll",IAUTO.class);
//声明DLL导出函数
boolean GetAuto();
}
}
原因是什么呢?
JNA(Java Native Access)是一个让Java程序能方便调用本地库(如DLL)的库。在您的问题中,DLL能够在VC/MFC的Demo中正常工作,但是在Java的Demo中调用DLL却无法正常SendMessage。
这可能是由于Java的Demo在调用DLL时的参数传递不正确导致的。例如,在Java中传递给DLL的消息(WM_SETTEXT和WM_LBUTTONDOWN/UP)可能不能被DLL正确识别。
建议您检查Java的Demo中调用DLL时传递给DLL的参数是否与VC/MFC的Demo中相同,并确保它们能够被DLL正确识别。