如何用Visual Basic读取Unicode格式INI文件中的值?
你的VB Unicode INI读写代码正确性分析 & 完整实现
嘿,我来帮你把这段代码捋清楚,先给你吃个定心丸:你已经写的WritePrivateProfileString部分是完全正确的!
已写部分的正确性说明
你在DllImport里指定了CharSet:=CharSet.Unicode,这会让CLR自动调用kernel32.dll中对应的宽字符版本API(也就是WritePrivateProfileStringW),完美适配Unicode格式的INI文件,这步抓得很准!
补全未完成的GetPrivateProfileString声明
你代码里的GetP...应该是GetPrivateProfileString,它的正确Unicode版本声明如下,我把整个完整的NativeMethods类给你整理好:
Private Class NativeMethods ' AJT 2014.11.28 Use the unicode function !!! <DllImport("kernel32", CharSet:=CharSet.Unicode, SetLastError:=True)> Public Shared Function WritePrivateProfileString( section As String, key As String, val As String, filePath As String ) As Boolean End Function ' AJT 2014.11.28 Use the unicode function !!! <DllImport("kernel32", CharSet:=CharSet.Unicode, SetLastError:=True)> Public Shared Function GetPrivateProfileString( section As String, key As String, defaultValue As String, buffer As StringBuilder, bufferSize As Integer, filePath As String ) As Integer End Function End Class
关键注意事项
- 我给两个API都加上了
SetLastError:=True,这样你可以在调用失败后用Marshal.GetLastWin32Error()获取具体的错误码,方便调试 - Unicode格式的INI文件通常是UTF-16LE编码(带BOM),如果你的INI文件是其他Unicode编码(比如UTF-8),Windows的API可能无法正确识别,建议保存成UTF-16LE格式
- 调用
GetPrivateProfileString时,要确保StringBuilder的缓冲区足够大,返回值是实际读取到的字符数(不含终止符)
简单使用示例
给你写个小例子,演示怎么用这些API读写Unicode INI:
' 写入Unicode INI Dim iniPath As String = "C:\test_unicode.ini" NativeMethods.WritePrivateProfileString("用户信息", "昵称", "张三😎", iniPath) ' 读取Unicode INI Dim sb As New StringBuilder(256) Dim readLength As Integer = NativeMethods.GetPrivateProfileString("用户信息", "昵称", "默认昵称", sb, sb.Capacity, iniPath) If readLength > 0 Then Console.WriteLine("读取到的昵称:" & sb.ToString()) Else Console.WriteLine("读取失败或键不存在") End If
内容的提问来源于stack exchange,提问作者Andrew Truckle
相关产品推荐
相关产品推荐

