为了账号安全,请及时绑定邮箱和手机立即绑定

在 Java 中使用 SHGetFileInfo 和 JNA

在 Java 中使用 SHGetFileInfo 和 JNA

鸿蒙传说 2022-08-17 15:53:29
我试图用JNA将SHGetFileInfo函数从Shell32转换为Java,并使用C#代码和这个作为参考而在C#代码中,psfi.iIcon在我翻译的Java代码中是432 psfi.iIcon是0。如果我是对的,对于同一个文件,无论我使用哪种语言,它们都应该是相同的,不是吗?我的 Java 代码:public static void main(String[] args) {    String path = "[PATH_TO_EXE]\\test.exe"; //Of course in my code I used the real path    SHFILEINFO sfi = new SHFILEINFO();    DWORD_PTR i = Shell32.INSTANCE.SHGetFileInfo(path, 0, sfi, sfi.size(), SHGFI.SysIconIndex);    System.out.println(sfi.iIcon); //<-- Prints 0, should print 432}public static class SHGFI {    static final int SysIconIndex = 0x000004000;    static final int LargeIcon = 0x000000000;    static final int UseFileAttributes = 0x000000010;}public interface Shell32 extends StdCallLibrary {    Shell32 INSTANCE = Native.loadLibrary("shell32", Shell32.class, W32APIOptions.UNICODE_OPTIONS);    DWORD_PTR SHGetFileInfo(String pszPath, int dwFileAttributes, SHFILEINFO psfi, int cbFileInfo, int uFlags);}public static class SHFILEINFO extends Structure {    public HICON hIcon;    public int iIcon;    public DWORD dwAttributes;    public char[] szDisplayName = new char[260];    public char[] szTypeName = new char[80];    @Override    protected List<String> getFieldOrder() {        return Arrays.asList("hIcon", "iIcon", "dwAttributes", "szDisplayName", "szTypeName");    }}我做错了什么基础吗?我是JNA和Windows功能的新手
查看完整描述

1 回答

?
慕桂英3389331

TA贡献2036条经验 获得超8个赞

“备注”部分下,有这样一条信息,恕我直言,这可能是您问题的根源

必须在调用 时或之前初始化组件对象模型 (COM)。CoInitializeOleInitializeSHGetFileInfo

这是一个非常直接的电话

CoInitialize(null);

正如DanielWiddis在评论中指出的那样,根据文档

应调用新应用程序而不是CoInitializeExCoInitialize

若要优雅地关闭 COM 库,必须通过对 的相应调用来平衡对 或 (包括返回的) 的每次成功调用CoInitializeCoInitializeExS_FALSECoUninitialize

CoInitializeEx(null, 0);
CoUninitialize();



查看完整回答
反对 回复 2022-08-17
  • 1 回答
  • 0 关注
  • 153 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号