JNA 没有来自 Windows API 的函数
JNA does not have a function from the Windows API
我负责将 Windows JNI 代码移植到 Java,并且已经使用 JNA。使用该库非常简单,因为它显然试图遵循 Windows' API 的结构和样式(我不太了解 API,我遵循原始 JNI 代码)。
我能够找到大多数 Windows API 函数的 JNA 等价物,但找不到 EnableWindow
.
这个函数是在winuser.h
and logically, one should find it under com.sun.jna.platform.win32.WinUser
里定义的吧?但是没有这样的功能, EnableWindow
的唯一提及是在 com.sun.jna.platform.win32.WinUser.WS_DISABLED
:
的文档中
[...] To change this after a window has been created, use the EnableWindow function.
仅此而已,没有其他关于该功能的参考、提及或指示。文档的其余部分同样简洁,当您不知道究竟要查看什么内容和在何处查看时,用处不大。
那么 JNA 的 EnableWindow
如果存在的话在哪里呢?如果没有,可以用什么来代替?
JNA 有两部分:核心功能(在 jna
工件中)和用户贡献的平台映射(在 jna-platform
工件中)。当用户为函数和常量提供映射时,他们通常将 Windows API 文档直接复制到 javadoc 中,因此经常引用尚未(尚未)映射的值。
如您所见,还没有用户为 EnableWindow
函数提供映射。那个用户可能就是你!
JNA FAQ 包含以下花絮:
JNA is missing function XXX in its platform library mappings
No, it's not, it's just waiting for you to add it :)
public interface MyUser32 extends User32 {
// DEFAULT_OPTIONS is critical for W32 API functions to simplify ASCII/UNICODE details
MyUser32 INSTANCE = (MyUser32)Native.load("user32", W32APIOptions.DEFAULT_OPTIONS);
void ThatFunctionYouReallyNeed();
}
这基本上是您自己添加功能的模板:扩展现有库(如果它已部分映射)或创建一个新库(如果尚未映射)(在这种情况下,扩展 Library
), 然后添加你需要的功能。
WinUser
与大多数映射略有不同;它不包含库加载语句,因为它只是头文件,在 JNA 中,DLL 加载库扩展 WinUser
.
所以您需要做更多的研究,看看要加载哪个 DLL 才能本地访问该功能。 The docs 表示它是 user32.dll,就像 JNA FAQ 示例一样!
所以模板在上面,你只需要函数映射。 Windows BOOL
映射到 Java 的 boolean
所以你只需要在你自己的代码库中这样做:
public interface MyUser32 extends User32 {
MyUser32 INSTANCE = (MyUser32) Native.load("user32", W32APIOptions.DEFAULT_OPTIONS);
boolean EnableWindow(HWND hWnd, boolean bEnable);
}
这将解决您在自己项目中的燃眉之急。
JNA 是一个用户维护的项目。请考虑将您的映射贡献给 JNA,这样下一个人就可以使用您的映射,而无需自己创建!
我负责将 Windows JNI 代码移植到 Java,并且已经使用 JNA。使用该库非常简单,因为它显然试图遵循 Windows' API 的结构和样式(我不太了解 API,我遵循原始 JNI 代码)。
我能够找到大多数 Windows API 函数的 JNA 等价物,但找不到 EnableWindow
.
这个函数是在winuser.h
and logically, one should find it under com.sun.jna.platform.win32.WinUser
里定义的吧?但是没有这样的功能, EnableWindow
的唯一提及是在 com.sun.jna.platform.win32.WinUser.WS_DISABLED
:
[...] To change this after a window has been created, use the EnableWindow function.
仅此而已,没有其他关于该功能的参考、提及或指示。文档的其余部分同样简洁,当您不知道究竟要查看什么内容和在何处查看时,用处不大。
那么 JNA 的 EnableWindow
如果存在的话在哪里呢?如果没有,可以用什么来代替?
JNA 有两部分:核心功能(在 jna
工件中)和用户贡献的平台映射(在 jna-platform
工件中)。当用户为函数和常量提供映射时,他们通常将 Windows API 文档直接复制到 javadoc 中,因此经常引用尚未(尚未)映射的值。
如您所见,还没有用户为 EnableWindow
函数提供映射。那个用户可能就是你!
JNA FAQ 包含以下花絮:
JNA is missing function XXX in its platform library mappings
No, it's not, it's just waiting for you to add it :)
public interface MyUser32 extends User32 { // DEFAULT_OPTIONS is critical for W32 API functions to simplify ASCII/UNICODE details MyUser32 INSTANCE = (MyUser32)Native.load("user32", W32APIOptions.DEFAULT_OPTIONS); void ThatFunctionYouReallyNeed(); }
这基本上是您自己添加功能的模板:扩展现有库(如果它已部分映射)或创建一个新库(如果尚未映射)(在这种情况下,扩展 Library
), 然后添加你需要的功能。
WinUser
与大多数映射略有不同;它不包含库加载语句,因为它只是头文件,在 JNA 中,DLL 加载库扩展 WinUser
.
所以您需要做更多的研究,看看要加载哪个 DLL 才能本地访问该功能。 The docs 表示它是 user32.dll,就像 JNA FAQ 示例一样!
所以模板在上面,你只需要函数映射。 Windows BOOL
映射到 Java 的 boolean
所以你只需要在你自己的代码库中这样做:
public interface MyUser32 extends User32 {
MyUser32 INSTANCE = (MyUser32) Native.load("user32", W32APIOptions.DEFAULT_OPTIONS);
boolean EnableWindow(HWND hWnd, boolean bEnable);
}
这将解决您在自己项目中的燃眉之急。
JNA 是一个用户维护的项目。请考虑将您的映射贡献给 JNA,这样下一个人就可以使用您的映射,而无需自己创建!