Java 为什么我对winapi RegisterClassExW的调用失败(使用JNA)?

Java 为什么我对winapi RegisterClassExW的调用失败(使用JNA)?,java,winapi,jna,Java,Winapi,Jna,这些是winapi方法 ATOM WINAPI RegisterClassEx( _In_ const WNDCLASSEX *lpwcx ); typedef struct tagWNDCLASSEX { UINT cbSize; UINT style; WNDPROC lpfnWndProc; int cbClsExtra; int cbWndExtra; HINSTANCE hInstance; H

这些是winapi方法

ATOM WINAPI RegisterClassEx(
     _In_ const WNDCLASSEX *lpwcx
  );

typedef struct tagWNDCLASSEX {
  UINT      cbSize;
  UINT      style;
  WNDPROC   lpfnWndProc;
  int       cbClsExtra;
  int       cbWndExtra;
  HINSTANCE hInstance;
  HICON     hIcon;
  HCURSOR   hCursor;
  HBRUSH    hbrBackground;
  LPCTSTR   lpszMenuName;
  LPCTSTR   lpszClassName;
  HICON     hIconSm;
} WNDCLASSEX, *PWNDCLASSEX;
我的Java代码:-

public class WNDCLASSEX extends com.sun.jna.Structure {
    public int cbSize;
    public int style;
    public WNDPROC lpfnWndProc;
    public int cbClsExtra;
    public int cbWndExtra;
    public HMODULE hInstance;
    public HICON hIcon;
    public HCURSOR hCursor;
    public HBRUSH hbrBackground;
    public String lpszMenuName;
    public String lpszClassName;
    public HICON hIconSm;
}

public interface User32 extends StdCallLibrary {
    User32 INSTANCE = (User32) Native.loadLibrary("user32", User32.class);
    Atom RegisterClassExW(WNDCLASSEX wc);
}

public class other {
  public static void main(String[] args){
      User32.WNDPROC WndProc = new User32.WNDPROC() {

         public LRESULT callback(HWND hWnd, int uMsg, WPARAM wParam, LPARAM lParam)
         {
            int id = User32.INSTANCE.GetWindowThreadProcessId(hWnd, null);
            return new LRESULT(0);
         }
      };
      WNDCLASSEX wc = new WNDCLASSEX();
      wc.style = 0;
      wc.lpfnWndProc = WndProc;
      wc.cbClsExtra = 0;
      wc.cbWndExtra = 0;
      wc.hInstance = null;
      wc.hIcon = null;
      wc.hbrBackground = null;
      wc.cbSize= wc.size(); 
      wc.lpszMenuName = null; 
      wc.lpszClassName = "Magnifier";


    Atom atom = User32.INSTANCE.RegisterClassExW(wc);
  }
}
如果调用RegisterClassExwc方法,则会出现以下错误。我认为问题在于wc是一个对象,但RegisterClassesXW接受指针

如果是这样,如何将wc作为指针发送? 否则我怎么解决这个问题

错误是

主线程java.lang.IllegalArgumentException中出现异常:函数RegisterClassesXw的参数0处的参数类型jna.extra.WNDCLASSEX不受支持

WNDCLASSEX需要扩展结构,然后需要实现其getFieldOrder方法


您的错误消息在哪里?@Jan我已经更新了问题。那么,User32.INSTANCE.RegisterClassExW对其参数的期望是什么?错误信息再清楚不过了。令人失望的是,您最初发布的代码是假的。请从中吸取教训。另外,你的窗口程序完全被破坏了,所以失败就在那里等待着你。打电话给DefWndProc。您已经为窗口类指定了一个由内置类使用的名称。您不能注册放大镜类。系统注册了它。用户没有发布真正的代码,因为用户正在他们的类中调用size方法。大概真正的代码已经和你的一样了。我们需要说服提问者解决这个问题。啊,我没有注意到@毗瑟奴,请更新你的问题。@technomage谢谢你的提问,但是如何知道它注册的课程是否成功。因为RegisterClassExW函数返回一个原子,但若我使用它来创建窗口,它显示1407找不到窗口类。错误。RegisterClassEx的文档描述了如何报告失败。我已经这样做了。如果我打印getLastError,它将0显示为响应。这意味着没有错误
public class WNDCLASSEX extends com.sun.jna.Structure {
    public int cbSize;
    public int style;
    public WNDPROC lpfnWndProc;
    public int cbClsExtra;
    public int cbWndExtra;
    public HMODULE hInstance;
    public HICON hIcon;
    public HCURSOR hCursor;
    public HBRUSH hbrBackground;
    public String lpszMenuName;
    public String lpszClassName;
    public HICON hIconSm;
    public List getFieldOrder() {
        return Arrays.asList("cbSize","style","lpfnWndProc","cbClsExtra","cbWndExtra","hInstance","hIcon","hCursor","hbrBackground","lpszMenuName","lpszClassName","hIconSm");
    }
}