- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我尝试使用 JNA 将 SHGetFileInfo 函数从 Shell32 翻译成 Java,并使用了 C# 代码和 this作为引用
虽然在 C# 代码中 psfi.iIcon 是 432,但在我翻译的 Java 代码中 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 函数的新手
最佳答案
在备注 部分下,有这条信息,恕我直言,这可能是您问题的根源
You must initialize Component Object Model (COM) with
CoInitialize
orOleInitialize
prior to callingSHGetFileInfo
.
这是一个非常简单的调用
CoInitialize(null);
正如 DanielWiddis 在评论中指出的那样,根据文档
New applications should call
CoInitializeEx
instead ofCoInitialize
和
To close the COM library gracefully, each successful call to
CoInitialize
orCoInitializeEx
, including those that returnS_FALSE
, must be balanced by a corresponding call toCoUninitialize
例子
CoInitializeEx(null, 0);
CoUninitialize();
关于java - 在带有 JNA 的 Java 中使用 SHGetFileInfo,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55208351/
我有一个很好的技术来获取当前系统中的关联扩展/图像(因为扩展可以从一个系统到另一个系统有不同的图像)。这是函数: public static Icon getIconFromFile(string e
我有一个简单的文件浏览器,我在那里显示文件和文件夹, 获得者(对于目录) SHFILEINFO info = new SHFILEINFO(); SHGetFileInfo(filename, FIL
以下是有关 SHGetFileInfo() 函数的 Windows 文档的摘录: You should call this function from a background thread. Fai
出于某种原因,为 .lnk 文件调用 SHGetFileInfo 会返回带有链接覆盖的图标,即使我没有请求它也是如此: Shell.SHGetFileInfo(path, 0, ref shFileI
我正在尝试为任何文件获取一个图标(如 HICON),以与资源管理器完全相同的方式绘制它。这意味着如果我有一个 exe 文件的路径,我应该绘制它的默认图标。如果我有一个链接 (.lnk) 文件,我必须绘
我正在使用 SHGetFileInfo 获取特定文件类型的图标。 MSDN 对 SHFILEINFO 说: hIcon Type: HICON A handle to the icon t
我在 Windows 10 专业版和 Visual Studio 2013 上,我正在使用 SHGetFileInfoW获取文件类型的图标位置(路径 + 索引): std::wstrin
这是我做的: LPMALLOC malloc; LPITEMIDLIST pidl; SHFILEINFO FileInfo; SFGAOF sfGao; if (SUCCEEDED(SHGetMal
function GetFileIcon(const filename:string): HICON; var shfi: TShFileInfo; begin try FillCha
我正在使用 cmake + nmake 构建 exe,我想从可执行文件本身获取图标句柄。 CMakeLists.txt: add_executable(test test.cpp test.rc) 测
在 .NET 4.0 应用程序 (WPF) 中,我们使用 SHGetFileInfo 获取目录树的 shell 图标。由于在某些情况下这需要相当长的时间(即对于无法访问的网络驱动器或软盘驱动器),我们
Context:目前在VisualStudio2012中开发/维护的程序,用VB(.NET)编写,针对Framework v3.5。我们的大多数客户都安装了荷兰语 Windows,并且大多数客户将其区
我尝试使用 JNA 将 SHGetFileInfo 函数从 Shell32 翻译成 Java,并使用了 C# 代码和 this作为引用 虽然在 C# 代码中 psfi.iIcon 是 432,但在我翻
我正在写一个文件管理器。当它打开时,用户界面会卡住一段时间。我分析了它,发现慢函数是 SHGetFileInfo。 SHFILEINFO shinfo; SHGetFileInfo(FullPath.
我正在尝试使用 SHGetFileInfo 检索文件信息(特别是关于图标的信息)。实际上,我没有文件的完整路径,我只有 pidl。 以下代码返回 (0L, (0, 0, 0, '', '')) 我的问
我有以下适用于 Windows XP 和 Vista 的代码 - 32 位和 64 位: public static Icon GetFolderIcon(IconSize size, FolderT
我正在使用 C#、Windows Forms、Net 2.0。 我正在使用 SHGetImageList 获取系统图像列表,比方说,SHIL_JUMBO 参数并在 Windows 7 上获取 256x
我是一名优秀的程序员,十分优秀!