的P/Invoke聲明:UpdateResource不lpType工作作爲字符串
[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
的新資源類型下添加新資源,而不是更新現有資源。
在的P/Invoke的UpdateResource
聲明,如果我超載string lpType
到IntPtr lpType
並把它傳遞一個new IntPtr(2)
,一切正常,但我不希望因爲我有時也需要string lpType
自定義資源類型和重載意願使用此解決方案在我當前的代碼設計中需要進行太多更改。
MSDN:
lpType [IN]
類型:LPCTSTR
資源類型進行更新。或者,不是指針,此參數可以是MAKEINTRESOURCE(ID),其中ID是代表預定義資源類型的整數 值。如果字符串的第一個字符 是英鎊符號(#),則其餘字符 表示一個十進制數字,該數字指定資源類型的整數標識符 。例如,字符串「#258」代表 標識符258
任何想法,爲什麼我不能更新通過傳遞lpType
字符串現有的位圖?我正在做什麼在MSDN中陳述。
PS:我絕對需要通過lpType
字符串,不能因上述(當前代碼設計需要太多的變化)所描述的理由超載使用IntPtr
。
是的,我知道,從這個問題:'超載將需要我目前的代碼設計太多的變化。' 沒有辦法只用一個字符串呢?我無法清楚解釋爲什麼我無法使用IntPtr的原因更多。 – user3666697
你可能做錯的唯一可能的事情不是嘗試它。 –