【发布时间】:2011-06-13 10:47:58
【问题描述】:
我最近在处理来自二级库/二进制模块的资源,遇到了一个奇怪的错误。
我有两个本地 WinAPI 引用:
[DllImport("kernel32.dll", SetLastError = true)]
public extern static bool EnumResourceNames(IntPtr hModule, int lpszType, EnumResNameProc lpEnumFunc, IntPtr lParam);
[DllImport("kernel32.dll", SetLastError=true)]
public extern static IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags);
当我调用 LoadLibraryEx 时,我得到了 IntPtr 实例——这正是我所需要的:
IntPtr x = WinApi.LoadLibraryEx(@"D:\Software\Reflector\Reflector.exe",IntPtr.Zero,2);
Debug.WriteLine(x.ToInt32());
但是,当我尝试枚举图标资源(由 ID = 3 定义)时:
Debug.WriteLine(WinApi.EnumResourceNames(x, 3, new EnumResNameProc(ListCallback), IntPtr.Zero));
Debug.WriteLine(Marshal.GetLastWin32Error());
我收到此错误代码(由 GetLastError 返回):
-532462766
据我所知,这通常意味着存在未知错误,但我只是好奇 - 从可执行文件中列出资源可能有什么问题?
【问题讨论】:
-
EnumResourceNames() 实际上返回 false 吗?如果它返回 true,那么 GetLastError() 的值是没有意义的。
-
是托管还是非托管DLL?
-
它返回 False - 显然它失败了。这是一个调用非托管 DLL (kernel32) 的托管 C# 应用程序。
标签: c# .net winapi interop kernel32