2008-09-24 20 views
5

Sadece .NET'den kernel32'de GetPrivateProfileString ve GetPrivateProfileSection'u çağırmakla uğraştım ve anlamadığım tuhaf bir şeye rastladım.GetPrivateProfileString Oddity

en bu encantation ile başlayalım: gerçekten ben lpApplicationName (bölüm) geçerseniz

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 

, hiçbir lpKeyName ve hiçbir lpDefault, o bölüm için tuşların hepsi almalısınız, ve yaptığım:% 50 zamanın

Ini dosyasında lpApplicationName birinci satırdan başlarsa, arabellek hiçbir şey döndürmez. Dosyadaki ikinci satırdaki lpApplicationName istatistikleri, beklenen değerleri döndürür.

İlk başta, Declare'de W sürümü ve Unicode kullanmayla ilgili bir konu vardı, ancak bunların değiştirilmesinin hiçbir etkisi yok gibi görünüyor.

Neyi eksik?

cevap

9

Açmakta olduğunuz dosyanın byte order mark (kodlama türünü işaret eden birkaç bayt) olup olmadığını kontrol edin.

Bu Windows API çağrıları bayt sırasını grok görünmez ve ilk bölümü kaçırmalarına neden olur (boş bir satır varsa her şey iyi çalışır).

+0

Stüdyonun basit test dosyaları için BOMS yazmayı bırakmasını söylemenin bir yolu var mı? – claco

+1

BOM'un sürüngen bir şekilde üremesi gerçeğinin farkında değildim. Neredeyse cevabını bulmadan önce neler olduğunu merak ederek bir saat harcadım. Harika! –

1

İyi çağrı. VS.NET'deki ini dosyasının düzenlenmesi elbette bir utf-8 BOM ekleyerek (Duh). Grrr. Not Defteri'nde açılması ve SaveAs ASCII yapılması beklenen sonuçları verir.

Çok açık. Yani geniş. Krampondan bir saat daha. :-)

Teşekkürler! - = Chris

+0

Evet - Geçenlerde kendimi kaybettim! İyi bir çözümüm yok, en kolay dosyayı açmadan ve bir hata vermeden önce el ile kontrol ediyor, ancak gerçekten kullanıcıya yardımcı olmuyor. –