我試圖用JNA將SHGetFileInfo函數(shù)從Shell32轉(zhuǎn)換為Java,并使用C#代碼和這個作為參考而在C#代碼中,psfi.iIcon在我翻譯的Java代碼中是432 psfi.iIcon是0。如果我是對的,對于同一個文件,無論我使用哪種語言,它們都應(yīng)該是相同的,不是嗎?我的 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"); }}我做錯了什么基礎(chǔ)嗎?我是JNA和Windows功能的新手
1 回答

慕桂英3389331
TA貢獻2036條經(jīng)驗 獲得超8個贊
在“備注”部分下,有這樣一條信息,恕我直言,這可能是您問題的根源
必須在調(diào)用 時或之前初始化組件對象模型 (COM)。
CoInitialize
OleInitialize
SHGetFileInfo
這是一個非常直接的電話
CoInitialize(null);
正如DanielWiddis在評論中指出的那樣,根據(jù)文檔
應(yīng)調(diào)用新應(yīng)用程序而不是
CoInitializeEx
CoInitialize
和
若要優(yōu)雅地關(guān)閉 COM 庫,必須通過對 的相應(yīng)調(diào)用來平衡對 或 (包括返回的) 的每次成功調(diào)用
CoInitialize
CoInitializeEx
S_FALSE
CoUninitialize
例
CoInitializeEx(null, 0); CoUninitialize();
添加回答
舉報
0/150
提交
取消