P/调用声明:
[DllImport("kernel32.dll")]
static extern bool UpdateResource(IntPtr hUpdate, IntPtr lpType, IntPtr lpName, ushort wLanguage, byte[] lpData, uint cbData);
[DllImport("kernel32.dll")]
static extern bool UpdateResource(IntPtr hUpdate, string lpType, int lpName, ushort wLanguage, byte[] lpData, uint cbData);
[DllImport("kernel32.dll")]
static extern IntPtr BeginUpdateResource(string pFileName, bool bDeleteExistingResources);
[DllImport("kernel32.dll")]
static extern bool EndUpdateResource(IntPtr hUpdate, bool fDiscard);
我的代码:
var hUpdate = BeginUpdateResource(FilePath, false);
var BMP = File.ReadAllBytes(BmpPath);
UpdateResource(hUpdate, "2", 123, 1033, BMP, (uint)BMP.Length);
UpdateResource(hUpdate, "#2", 123, 1033, BMP, (uint)BMP.Length);
UpdateResource(hUpdate, "RT_BITMAP", 123, 1033, BMP, (uint)BMP.Length);
UpdateResource(hUpdate, "BITMAP", 123, 1033, BMP, (uint)BMP.Length);
EndUpdateResource(hUpdate, false);
上述
UpdateResource
调用均无效。他们将新资源添加到名为#2, RT_BITMAP, BITMAP
的新资源类型下,而不更新现有资源。在
UpdateResource
的P/Invoke声明中,如果我将string lpType
重载到IntPtr lpType
并将其传递给new IntPtr(2)
,则一切正常,但我不想使用此解决方案,因为有时我还需要string lpType
来定制资源类型,并且重载将需要进行太多更改在我当前的代码设计中。MSDN:
知道为什么我不能通过传递
lpType
一个字符串来更新现有位图吗?我所做的正是MSDN中所说的。PS:我绝对需要传递
lpType
一个字符串,由于上述原因(当前代码设计所需的更改太多),无法通过重载使用IntPtr
。 最佳答案
MSDN很可能是错误的。lpName
参数的文档说:“在创建新资源时,请勿为此参数使用以'#'字符开头的字符串。我想对lpType
也有同样的限制。
您可以在不更改其余代码结构的情况下解决此问题。
定义UpdateResource
的两个重载,但将它们设置为私有(private)并重命名(也许重命名为UpdateResourceW
)。
然后在C#中定义您自己的公共(public)UpdateResource
函数。这应该检查lpType
参数。如果类型以#
开头,则将其转换为整数并调用IntPtr lpType
重载,否则使用string lpType
重载。
因此,您可以在整个代码中将字符串用于资源类型,并在一个地方处理此细节。
关于c# - UpdateResource不适用于lpType作为字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23816567/