【问题标题】:using ini file in vb6, problem with path to file在vb6中使用ini文件,文件路径有问题
【发布时间】:2009-01-23 03:48:54
【问题描述】:

我已经阅读了很多关于如何在我的 VB6 项目中使用 INI 文件的文章。我的方法没有问题,我的问题是如何让EXE文件找到INI文件。我不想在程序中硬编码路径。我只是希望 EXE 期望 INI 文件存在于执行 EXE 的同一文件夹中。

当我从 VB6 IDE 内部运行程序时,会找到并处理 INI。当我编译程序并运行 EXE 时,什么也找不到。

我的代码如下:

gServer = sGetINI(sINIFile, "TOOLBOM", "ServerName", "?")

其中TOOLBOM 是[Section],而“ServerName”是值的键。

我获得了以下API代码:

Rem API DECLARATIONS
Declare Function GetPrivateProfileString Lib "kernel32" Alias _
                 "GetPrivateProfileStringA" (ByVal lpApplicationName _
                 As String, ByVal lpKeyName As Any, ByVal lpDefault _
                 As String, ByVal lpReturnedString As String, ByVal _
                 nSize As Long, ByVal lpFileName As String) As Long
Declare Function WritePrivateProfileString Lib "kernel32" Alias _
                 "WritePrivateProfileStringA" (ByVal lpApplicationName _
                 As String, ByVal lpKeyName As Any, ByVal lpString As Any, _
                 ByVal lpFileName As String) As Long
Public Function sGetINI(sINIFile As String, sSection As String, sKey _
                As String, sDefault As String) As String
    Dim sTemp As String * 256
    Dim nLength As Integer
    sTemp = Space$(256)
    nLength = GetPrivateProfileString(sSection, sKey, sDefault, sTemp, _
              255, sINIFile)
    sGetINI = Left$(sTemp, nLength)
End Function
Public Sub writeINI(sINIFile As String, sSection As String, sKey _
           As String, sValue As String)
    Dim n As Integer
    Dim sTemp As String
    sTemp = sValue
    Rem Replace any CR/LF characters with spaces
    For n = 1 To Len(sValue)
        If Mid$(sValue, n, 1) = vbCr Or Mid$(sValue, n, 1) = vbLf _
        Then Mid$(sValue, n) = " "
    Next n
    n = WritePrivateProfileString(sSection, sKey, sTemp, sINIFile)
End Sub

【问题讨论】:

    标签: vb6 path ini


    【解决方案1】:

    在 VB6 中,您可以使用 App.Path 指定文件的路径,这些文件应该位于您正在执行的目录中。例如

    sIniFile = App.Path & "\myIniFile.ini"
    

    您遇到了什么错误?

    【讨论】:

    • 除非您使用 INI 文件,否则最好通过 SaveSetting 和 GetSetting 使用注册表。管理员可以禁止非管理员更新 Program Files 目录中的文件,因此如果您的程序保存在 App.Path 中,则无法更新 INI 设置。为答案 +1,不过
    • 大部分注册表对从 Vista 开始的标准用户都是禁止访问的。 Microsoft 建议您移回 INI 文件,因为注册表污染已成为一个问题。
    • 只要有人尝试在 Vista 或更高版本上运行它,它就会失败。可写数据文件不应该进入程序文件。既然人们还是这样做了,Windows 就开始执行从 Vista 开始的规则。
    • 作为 VB6 的老前辈,我应该警告您,如果您的应用程序安装在驱动器根目录中,例如 C:,那么 App.Path 将返回一个带有尾部反斜杠的字符串,例如“C :\" 你的字符串中会有两个反斜杠。仅当您的应用程序将位于 CD 的根目录中时,这几天才重要
    【解决方案2】:

    Bob 是对的,只要有人尝试在 Vista 或更高版本上运行它,它就会失败。可写数据文件不应该放在 Program Files 中。 Windows 现在强制执行这些规则。所有用户的全局设置属于一个文件夹,每个用户的设置属于另一个文件夹,每个用户的漫游设置属于另一个文件夹,等等。

    Karl Peterson 的 Visual Studio Magazine article 提供了一些 VB6 代码,您可以将其放入项目中,以便在运行时找到这些文件夹的位置。然后同一作者的this previous article 为您提供了一个很好的使用 INI 文件的类,以隐藏那些 API 声明。

    【讨论】:

      【解决方案3】:

      一旦有人尝试在 Vista 或更高版本上运行它,它就会失败。

      可写数据文件不应该进入程序文件。由于人们无论如何都这样做了,Windows 开始执行从 Vista 开始的规则。

      全局设置位于 CommonAppData 下的应用程序文件夹中,按用户设置位于 LocalAppData 下方,按使用漫游设置位于 AppData 下方,依此类推。这些位置是在运行时通过 Shell 对象或 API 调用检索的。

      【讨论】:

        【解决方案4】:

        您需要使用脚本运行时中的 FileSystemObject 来正确组合路径和文件名。尽管在现实中这似乎是一个微不足道的问题,但 FileSystemObject 可以处理一些极端情况。

        【讨论】:

          【解决方案5】:

          app.path 将返回当前正在执行的 exe 的路径,使用它

          【讨论】:

            【解决方案6】:

            将EXE保存在同一个文件夹中

            【讨论】:

              猜你喜欢
              • 2020-12-15
              • 2021-10-22
              • 2017-12-15
              • 1970-01-01
              • 2013-07-14
              • 1970-01-01
              • 2011-02-26
              • 1970-01-01
              相关资源
              最近更新 更多