2008-09-24 23 views
5

Tôi vừa mới giải quyết xung quanh bằng cách gọi GetPrivateProfileString và GetPrivateProfileSection trong kernel32 từ .NET và bắt gặp một số điều kỳ lạ mà tôi không hiểu.GetPrivateProfileString Oddity

Hãy bắt đầu với encantation này:

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 

Nếu tôi vượt qua một lpApplicationName (phần), không có lpKeyName và không lpDefault, tôi sẽ nhận được tất cả các phím cho phần đó, và thực sự tôi làm: 50% thời gian.

Nếu tệp ini có lpApplicationName bắt đầu trên dòng đầu tiên, bộ đệm sẽ không trả về gì cả. Nếu số liệu thống kê lpApplicationName trên dòng thứ hai trong tệp, nó trả về giá trị mong đợi.

Lúc đầu, mặc dù nó là vấn đề của việc sử dụng phiên bản W và Unicode trong phần Khai báo, nhưng việc thay đổi chúng dường như không có hiệu lực.

Tôi đang thiếu gì?

Trả lời

9

Kiểm tra xem tệp bạn đang mở có byte order mark không (một vài byte đánh dấu loại mã hóa văn bản).

Các cuộc gọi API Windows này dường như không làm mờ các dấu thứ tự byte và khiến chúng bỏ lỡ phần đầu tiên (do đó mọi thứ hoạt động tốt nếu có dòng trống).

+0

Có cách nào để yêu cầu studio ngừng viết BOMS cho các tệp thử nghiệm đơn giản không? – claco

+1

Tôi đã không nhận thức được thực tế là BOM creep trong lén lút. Tôi gần như đã dành một giờ để tự hỏi điều gì đang xảy ra trước khi tôi tìm thấy câu trả lời của bạn. Tuyệt quá! –

1

Cuộc gọi tốt. Việc chỉnh sửa tệp ini trong VS.NET là tất nhiên (Duh) thêm một utf-8 BOM. Grrr. Mở nó trong notepad và thực hiện SaveAs ASCII mang lại kết quả mong đợi.

Rất rõ ràng. Vì vậy, ngớ ngẩn. Một giờ nữa thôi. :-)

Cảm ơn! - = Chris

+0

Vâng - Tôi đã mất giờ đó gần đây! Tôi không có giải pháp tốt, dễ nhất là kiểm tra tệp theo cách thủ công trước khi mở tệp và phát hành lỗi nhưng không thực sự giúp người dùng. –