2014-05-22 65 views
5

的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 lpTypeIntPtr lpType並把它傳遞一個new IntPtr(2),一切正常,但我不希望因爲我有時也需要string lpType自定義資源類型和重載意願使用此解決方案在我當前的代碼設計中需要進行太多更改。

MSDN:

lpType [IN]

類型:LPCTSTR

資源類型進行更新。或者,不是指針,此參數可以是MAKEINTRESOURCE(ID),其中ID是代表預定義資源類型的整數 值。如果字符串的第一個字符 是英鎊符號(#),則其餘字符 表示一個十進制數字,該數字指定資源類型的整數標識符 。例如,字符串「#258」代表 標識符258

任何想法,爲什麼我不能更新通過傳遞lpType字符串現有的位圖?我正在做什麼在MSDN中陳述。

PS:我絕對需要通過lpType字符串,不能因上述(當前代碼設計需要太多的變化)所描述的理由超載使用IntPtr

+0

是的,我知道,從這個問題:'超載將需要我目前的代碼設計太多的變化。' 沒有辦法只用一個字符串呢?我無法清楚解釋爲什麼我無法使用IntPtr的原因更多。 – user3666697

+0

你可能做錯的唯一可能的事情不是嘗試它。 –

回答

3

最有可能的MSDN是錯誤的。

lpName參數的文檔說「創建新資源時不要使用以該參數的'#'字符開頭的字符串」。我想象一下lpType也有同樣的限制。

您可以修復此問題而不更改其餘代碼的結構。

定義UpdateResource的兩個重載,但將它們設爲私有並重命名它們(可能爲UpdateResourceW)。

然後在C#中定義自己的公共UpdateResource函數。這應該檢查lpType參數。如果類型以#將其轉換爲整數並調用IntPtr lpType過載,否則使用string lpType過載。

因此,您可以在整個代碼中爲資源類型使用字符串,並在一個位置處理這些細節。

+0

太簡單了。爲什麼我沒有想到這個? – user3666697

+0

MSDN對此也是錯誤的:'創建新資源時不要使用以該參數的'#'字符開頭的字符串該語句暗示在不創建新資源時,即替換現有資源時,可以使用'#'字符。但即使這樣也不會更新現有資源,它會添加另一個名爲「#123」的名稱。 – user3666697