我想向exe添加许多资源。我注意到我只能为少数资源这样做:
// BeginUpdate();
// for (int i = 0; i < count; i++)
// UpdateResource();
// EndUpdate();
因为WinApi中好像有bug什么的。我现在正在尝试这样做:
// for (int i = 0; i < count; i++)
// {
// BeginUpdate();
// UpdateResource();
// EndUpdate();
// }
但当然不会发生。有时GetLastError()
返回错误代码 5(访问被拒绝)和 110(系统无法打开指定的设备或文件。)。它适用于某些资源,然后错误 110 分组出现。有时错误 5 会单独出现。我该如何解决这些错误?我必须添加 1000 多个资源,并且该功能必须完全成功或失败,两者之间没有任何关系。
这是我只添加随机字符串的函数:
[DllImport("kernel32.dll")]
public static extern uint GetLastError();
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern IntPtr BeginUpdateResource([MarshalAs(UnmanagedType.LPStr)] string filename, bool deleteExistingResources);
[DllImport("kernel32.dll", CharSet = CharSet.Ansi, SetLastError = true)]
public static extern bool UpdateResource(IntPtr resource, [MarshalAs(UnmanagedType.LPStr)] string type, [MarshalAs(UnmanagedType.LPStr)] string name, ushort language, IntPtr data, uint dataSize);
[DllImport("kernel32.dll", SetLastError = true)]
public static extern bool EndUpdateResource(IntPtr resource, bool discardChanges);
private static void addResources(string filename, int count)
{
// 1. delete existing resources
IntPtr handle = BeginUpdateResource(filename, true);
Console.WriteLine(EndUpdateResource(handle, false));
// 2. add resources
for (int i = 0; i < count; i++)
{
handle = BeginUpdateResource(filename, false);
string text = Utils.randomString(16);
if (!UpdateResource(handle, "TEST", "" + i, 0, Marshal.StringToHGlobalAnsi(text), (uint) text.Length))
Console.WriteLine("update error: " + GetLastError() + ", " + i);
if (!EndUpdateResource(handle, false))
Console.WriteLine("endupdate error: " + GetLastError() + ", " + i);
}
}