【问题标题】:Correct mapping for SHChangeNotify in JNAJNA 中 SHChangeNotify 的正确映射
【发布时间】:2011-12-01 09:47:28
【问题描述】:

这是来自 MSDN 的 SHChangeNotify 函数的语法:

void SHChangeNotify(
  LONG wEventId,
  UINT uFlags,
  __in_opt  LPCVOID dwItem1,
  __in_opt  LPCVOID dwItem2
);

我必须在 Java Native Access [JNA] 中编写它的 Java 对应物,但这个声明似乎是错误的:

public interface Shell32 extends com.sun.jna.platform.win32.Shell32 {

    public Shell32 INSTANCE = (Shell32) Native.loadLibrary(Shell32.class);

    void SHChangeNotify(long wEventId, int uFlags, Pointer dwItem1, Pointer dwItem2);

}

我遇到了以下异常:

线程“主”java.lang.UnsatisfiedLinkError 中的异常:错误 查找函数“SHChangeNotify”

知道如何正确写吗?

【问题讨论】:

    标签: java jna


    【解决方案1】:

    不是从com.sun.jna.platform.win32.Shell32扩展Shell32接口,而是从StdCallLibrary扩展它

    public interface Shell32 extends StdCallLibrary {
        final static Map<String, Object> WIN32API_OPTIONS = new HashMap<String, Object>() {
            private static final long serialVersionUID = 1L;
            {
                put(Library.OPTION_FUNCTION_MAPPER, W32APIFunctionMapper.UNICODE);
                put(Library.OPTION_TYPE_MAPPER, W32APITypeMapper.UNICODE);
            }
        };
    
        public Shell32 INSTANCE = (Shell32) Native.loadLibrary("Shell32", Shell32.class, WIN32API_OPTIONS);
    
        //whatever you want to expose here
    }
    

    【讨论】:

    • 问题出在 public Shell32 INSTANCE = (Shell32) Native.loadLibrary("Shell32", Shell32.class, WIN32API_OPTIONS);我忘了添加这个参数:“Shell32”。
    • 从原Shell32派生并没有错,但是需要像原Shell32那样调用Native.loadLibrary。此外,您的第一个参数应该是 32 位数量,而不是 64 位。 win32 平台库包含 LONG 的定义,或者您可以简单地使用 Java“int”。
    • @technomage,你的第一句话是有效的,因为 OP 评论说无论从什么接口扩展它都可以工作。错误只是忘记了库名称字符串。但是,我试图理解你评论的其余部分。关于SHChangeNotify的第一个参数使用Javaint类型;您建议的 Java int 类型肯定会导致 EXCEPTION_ACCESS_VIOLATION;不过,我更喜欢使用 Java long 而不是 com.sun.jna.platform.win32.WinDef.LONG,因为前者在我的单元测试中完美无缺。
    猜你喜欢
    • 1970-01-01
    • 2015-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-02
    相关资源
    最近更新 更多