繁体   English   中英

使用Visual Basic读取Unicode INI文件

[英]Using Visual Basic to read a Unicode INI file

使用Visual Basic从Unicode INI文档中读取INI值。

我认为这是正确的:

Private Class NativeMethods
    ' AJT 2014.11.28 Use the unicode function !!!
    <DllImport("kernel32", CharSet:=CharSet.Unicode)>
    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)>
    Public Shared Function GetPrivateProfileString(section As String, key As String, def As String, retVal As StringBuilder, size As Integer, filePath As String) As Integer
    End Function
End Class

但是从INI文件读取俄语数据时出现问号。

然后我偶然发现了这个定义:

 Private Declare Function GetPrivateProfileString _ Lib "kernel32" Alias "GetPrivateProfileStringA" _ (ByVal lpSectionName As String, _ ByVal lpKeyName As Any, _ ByVal lpDefault As String, _ ByVal lpbuffurnedString As String, _ ByVal nBuffSize As Long, _ ByVal lpFileName As String) As Long 

我注意到他们使用了GetPrivateProfileStringA ,这使我认为我可能需要使用GetPrivateProfileStringW但是现在我很困惑,因为我正在使用:

<DllImport("kernel32", CharSet:=CharSet.Unicode)>

请帮忙。

您提供的链接早于.NET。 您正在查看的内容( Lib "kernel32" Alias "GetPrivateProfileStringA"语法)实际上是在VB6等中导入非托管类型等的旧方法。此语法在VB.NET中仍然适用,但是已被取代通过DllImport功能实现。 如果使用这种较旧的处理方式,则正确的做法是,您需要指定"GetPrivateProfileStringW"而不是"GetPrivateProfileStringA"

对于您遇到的问题,俄语字符可能不是您出现问题的真正原因; 可能是您只是在获取垃圾数据。 如果未使用一个或多个参数的正确类型定义DllImport方法的参数,则会发生这种情况。

尝试看看以下链接。 PInvoke网站通常包含有关如何正确定义方法签名的有用信息: https : //www.pinvoke.net/default.aspx/kernel32.getprivateprofilestring https://www.pinvoke.net/default.aspx/kernel32.writeprivateprofilestring

为了完整起见,我在下面添加了这些定义(直接从上面的链接复制,尽管我承认我自己尚未对其进行测试)。 如果您仍然对此感到困难,则可能需要使用您尝试读取的INI文件内容示例来更新答案。

GetPrivateProfileString():

DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, _
                        ByVal lpKeyName As String, _
                        ByVal lpDefault As String, _
                        ByVal lpReturnedString As StringBuilder, _
                        ByVal nSize As Integer, _
                        ByVal lpFileName As String) As Integer
End Function

WritePrivateProfileString():

<DllImport("kernel32.dll", SetLastError:=True, CharSet:=CharSet.Unicode)> _
Private Shared Function GetPrivateProfileString(ByVal lpAppName As String, _
                        ByVal lpKeyName As String, _
                        ByVal lpDefault As String, _
                        ByVal lpReturnedString As StringBuilder, _
                        ByVal nSize As Integer, _
                        ByVal lpFileName As String) As Integer
End Function

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM