2008-09-24 13 views
5

मैं .NET से कर्नेल 32 में GetPrivateProfileString और GetPrivateProfileSection को कॉल करने के साथ बस चारों ओर झुका रहा था और कुछ समझ में आया जो मुझे समझ में नहीं आया।GetPrivateProfileString विषमता

के इस encantation साथ शुरू करते हैं:

Private Declare Unicode Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringW" (_ 
    ByVal lpApplicationName As String, _ 
    ByVal lpKeyName As String, _ 
    ByVal lpDefault As String, _ 
    ByVal lpReturnedString() As Char, _ 
    ByVal nSize As Int32, _ 
    ByVal lpFileName As String) As Int32 

अगर मैं एक lpApplicationName (खंड) में पारित, कोई lpKeyName और कोई lpDefault, मुझे लगता है कि खंड के लिए कुंजी के सभी मिलना चाहिए, और वास्तव में मुझे क्या करना: 50% समय की।

यदि आईएनआई फ़ाइल में पहली पंक्ति पर lpAplicationName शुरू होता है, तो बफर कुछ भी नहीं देता है। यदि फ़ाइल में दूसरी पंक्ति पर lpAplicationName आंकड़े हैं, तो यह अपेक्षित मान देता है।

पहले मैं हालांकि डब्ल्यू संस्करण और यूनिकोड का उपयोग करने का विषय था, लेकिन उनको बदलने से कोई प्रभाव नहीं पड़ता।

मुझे क्या याद आ रही है?

उत्तर

9

यह देखने के लिए जांचें कि क्या आप फ़ाइल खोल रहे हैं byte order mark (टेक्स्ट एन्कोडिंग के प्रकार को चिह्नित करने वाले कुछ बाइट्स) हैं।

ये विंडोज एपीआई कॉल बाइट ऑर्डर अंक ग्रोक नहीं लगते हैं और उन्हें पहले खंड को याद करने का कारण बनता है (इसलिए रिक्त रेखा होने पर सब कुछ ठीक काम करता है)।

+0

क्या सरल परीक्षण फ़ाइलों के लिए बोम्स लिखना बंद करने के लिए स्टूडियो को बताने का कोई तरीका है? – claco

+1

मुझे इस तथ्य से अवगत नहीं था कि बीओएम आत्मसमर्पण में रेंग रहा है। मैंने लगभग एक घंटा बिताया कि मुझे आपका जवाब मिलने से पहले क्या चल रहा था। महान! –

1

अच्छी कॉल। VS.NET में आईएनआई फ़ाइल को संपादित करना निश्चित रूप से (डुह) एक यूटीएफ -8 बीओएम जोड़ रहा है। गरर। इसे नोटपैड में खोलना और SaveAs ASCII करने से अपेक्षित परिणाम मिलते हैं।

तो स्पष्ट। तो उलझन में। क्रैपर के नीचे एक और घंटा। :-)

धन्यवाद! - = क्रिस

+0

हाँ - मैंने हाल ही में उस घंटे को खो दिया है! मेरे पास कोई अच्छा समाधान नहीं है, इसे खोलने से पहले फ़ाइल को मैन्युअल रूप से जांचना और त्रुटि जारी करना सबसे आसान है, लेकिन वास्तव में उपयोगकर्ता की सहायता नहीं करता है। –