- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我最近在处理二级库/二进制模块的资源时遇到了一个奇怪的错误。
我有两个 native 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
据我所知,这通常意味着存在未知错误,但我只是好奇 - 从可执行文件中列出资源可能有什么问题?
最佳答案
-532462766 == 0xe0434352。最后三个十六进制对拼写为“CCR”,这是 Microsoft 程序员用来尝试编写易于识别的异常代码的常用技巧。确切的含义非常神秘,除了它通常与托管代码相关联并且在通常不会产生有意义的托管异常的子系统中看起来非常低级别。
那个神秘异常有一个很好的候选原因,您的 EnumResources pinvoke 声明是错误的。第二个参数是 IntPtr,不是 int。这在 64 位操作系统上有一定的成功率。
如果您弄清楚 CCR 的含义,请回帖。
using System;
using System.ComponentModel;
using System.Runtime.InteropServices;
using System.Diagnostics;
class Program {
static void Main(string[] args) {
try {
IntPtr module = LoadLibraryEx(@"C:\windows\system32\user32.dll", IntPtr.Zero, 2);
if (module == IntPtr.Zero) throw new Win32Exception();
if (!EnumResourceNames(module, (IntPtr)3, new EnumResNameProc(ListCallback), IntPtr.Zero))
throw new Win32Exception();
}
catch (Win32Exception ex) {
Console.WriteLine(ex.Message);
}
Console.ReadLine();
}
static bool ListCallback(IntPtr hModule, IntPtr type, IntPtr name, IntPtr lp) {
long idorname = (long)name;
if (idorname >> 16 == 0) Console.WriteLine("#{0}", idorname);
else Console.WriteLine(Marshal.PtrToStringAnsi(name));
return true;
}
public delegate bool EnumResNameProc(IntPtr hModule, IntPtr type, IntPtr name, IntPtr lp);
[DllImport("kernel32.dll", SetLastError = true)]
public extern static bool EnumResourceNames(IntPtr hModule, IntPtr type, EnumResNameProc lpEnumFunc, IntPtr lParam);
[DllImport("kernel32.dll", SetLastError = true)]
public extern static IntPtr LoadLibraryEx(string lpFileName, IntPtr hFile, int dwFlags);
}
关于c# - EnumResourceNames 问题 - 未知错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4764249/
我最近在处理二级库/二进制模块的资源时遇到了一个奇怪的错误。 我有两个 native WinAPI 引用: [DllImport("kernel32.dll", SetLastError = true
所以我尝试使用 C++ 从给定文件(在我的例子中是桌面上的 .msstyle)中读取资源类型和名称 但不知何故,resinfo 结果有点奇怪而且不准确。它不写实际发现的内容。例如,msstyle 给出
(请参阅底部的编辑) 使用 EnumResourceNames,我试图找到作为资源存储在我自己的 dll 中的图标。这是完整的dll代码: library focusRes; {$R focusRes
在Delphi XE2 Win32平台上运行以下代码可以正常工作。但是,在 win64 平台上编译的相同代码如果在 Debug模式下运行,将导致“EnumRCDataProc”中的访问冲突: proc
我是一名优秀的程序员,十分优秀!