gpt4 book ai didi

c# - UpdateResource 不适用于 lpType 作为字符串

转载 作者:太空狗 更新时间:2023-10-29 23:31:13 26 4
gpt4 key购买 nike

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 [in]

Type: LPCTSTR

The resource type to be updated. Alternatively, rather than a pointer, this parameter can be MAKEINTRESOURCE(ID), where ID is an integer value representing a predefined resource type. If the first character of the string is a pound sign (#), then the remaining characters represent a decimal number that specifies the integer identifier of the resource type. For example, the string "#258" represents the identifier 258.

知道为什么我不能通过传递 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com