2014-05-22 10 views
5

पी/आह्वान घोषणाओं: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 नामक एक नए संसाधन प्रकार के तहत नया संसाधन जोड़ते हैं।

पी में/आह्वान UpdateResource की घोषणा, अगर मैं IntPtr lpType को string lpType ओवरलोड और यह एक new IntPtr(2) गुजरती हैं, सब कुछ काम करता है, लेकिन मैं इस समाधान का उपयोग करने के लिए है, क्योंकि कभी कभी मैं भी कस्टम संसाधन प्रकार और अधिक भार इच्छा के लिए string lpType की जरूरत नहीं करना चाहती मेरे वर्तमान कोड डिज़ाइन में बहुत सारे बदलाव की आवश्यकता है।

MSDN:

lpType [में]

प्रकार: LPCTSTR

संसाधन प्रकार अद्यतन करने की। वैकल्पिक रूप से, सूचक के बजाय, यह पैरामीटर MAKEINTRESOURCE (ID) हो सकता है, जहां आईडी एक पूर्णांक मान पूर्वनिर्धारित संसाधन प्रकार का प्रतिनिधित्व करता है। यदि स्ट्रिंग का पहला अक्षर पाउंड साइन (#) है, तो शेष वर्ण दशमलव संख्या का प्रतिनिधित्व करते हैं जो संसाधन प्रकार के पूर्णांक पहचानकर्ता को निर्दिष्ट करता है। उदाहरण के लिए, स्ट्रिंग "# 258" का प्रतिनिधित्व करता पहचानकर्ता 258.

किसी भी विचार क्यों मैं lpType एक स्ट्रिंग पारित करके मौजूदा बिटमैप अद्यतन नहीं कर सकते? मैं एमएसडीएन में जो कुछ कहा है, वही कर रहा हूं।

पुनश्च: मैं बिल्कुलlpType एक स्ट्रिंग पारित करने के लिए की जरूरत है, कारण (वर्तमान कोड डिजाइन के लिए आवश्यक बहुत अधिक परिवर्तन) ऊपर कहा गया है की वजह से अधिक भार से IntPtr उपयोग नहीं कर सकते।

+0

हां मुझे पता है, प्रश्न से: 'ओवरलोडिंग को मेरे वर्तमान कोड डिज़ाइन में बहुत सारे बदलावों की आवश्यकता होगी।' क्या केवल एक स्ट्रिंग के साथ ऐसा करने का कोई तरीका नहीं है? ऐसे कई कारण हैं जिन्हें मैं स्पष्ट रूप से समझा नहीं सकता कि मैं इंटिप्टर का उपयोग क्यों नहीं कर सकता। – user3666697

+0

एकमात्र संभव चीज जो आप गलत कर सकते हैं वह कोशिश नहीं कर रही है। –

उत्तर

3

अधिकतर एमएसडीएन गलत है।

lpName पैरामीटर के लिए प्रलेखन कहता है "जब कोई नया संसाधन बनाते हैं तो इस पैरामीटर के लिए '#' वर्ण से शुरू होने वाली स्ट्रिंग का उपयोग न करें"। मुझे लगता है कि एक ही प्रतिबंध lpType पर लागू होता है।

आप अपने शेष कोड की संरचना को बदले बिना इसे ठीक कर सकते हैं।

UpdateResource दोनों ओवरलोड को परिभाषित करें, लेकिन उन्हें निजी बनाएं और उनका नाम बदलें (शायद UpdateResourceW पर)।

फिर सी # में अपने स्वयं के UpdateResource फ़ंक्शन को परिभाषित करें। इसे lpType पैरामीटर का निरीक्षण करना चाहिए। यदि # के साथ टाइप शुरू होता है तो इसे एक पूर्णांक में परिवर्तित करें और IntPtr lpType ओवरलोड पर कॉल करें, अन्यथा string lpType ओवरलोड का उपयोग करें।

इस प्रकार आप अपने कोड में संसाधन प्रकारों के लिए स्ट्रिंग का उपयोग कर सकते हैं, और इस विवरण को एक ही स्थान पर संभाल सकते हैं।

+0

इतना आसान है। मैंने इसके बारे में क्यों नहीं सोचा? – user3666697

+0

एमएसडीएन इस बारे में भी गलत है: 'जब कोई नया संसाधन बनाते हैं तो इस पैरामीटर के लिए' # 'वर्ण से शुरू होने वाली स्ट्रिंग का उपयोग नहीं करते हैं। कथन का तात्पर्य है कि जब कोई नया संसाधन नहीं बना रहा है, तो मौजूदा संसाधन को प्रतिस्थापित करते समय, '#' चरित्र का उपयोग किया जा सकता है। लेकिन यहां तक ​​कि मौजूदा संसाधन को अद्यतन नहीं करता है, यह नाम '# 123' नाम के साथ एक और जोड़ता है। – user3666697

संबंधित मुद्दे