luliily 2023-01-12 17:48 采纳率: 100%
浏览 36
已结题

Java通过JNA调用Windows的DLL的异常问题

Java用JNA调用Windows的DLL时候出现一些问题:

DLL的主要作用是充当脚本,执行一些固定的动作:

  1. 通过GetWindow寻找指定的编辑框,再通过SendMessage发送WM_SETTEXT来填充文本
  2. 通过GetWindow寻找指定的按钮,再通过SendMessage发送WM_LBUTTONDOWN、WM_LBUTTONUP来模拟按钮点击

在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();
    }
}

原因是什么呢?

  • 写回答

2条回答 默认 最新

  • ChatGPTᴼᴾᴱᴺᴬᴵ 2023-01-12 19:10
    关注

    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正确识别。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 1月21日
  • 已采纳回答 1月13日
  • 创建了问题 1月12日

悬赏问题

  • ¥170 如图所示配置eNSP
  • ¥20 docker里部署springboot项目,访问不到扬声器
  • ¥15 netty整合springboot之后自动重连失效
  • ¥15 悬赏!微信开发者工具报错,求帮改
  • ¥20 wireshark抓不到vlan
  • ¥20 关于#stm32#的问题:需要指导自动酸碱滴定仪的原理图程序代码及仿真
  • ¥20 设计一款异域新娘的视频相亲软件需要哪些技术支持
  • ¥15 stata安慰剂检验作图但是真实值不出现在图上
  • ¥15 c程序不知道为什么得不到结果
  • ¥15 键盘指令混乱情况下的启动盘系统重装