использование INI-файла в VB6, проблема с путем к файлу - PullRequest
1 голос
/ 23 января 2009

Я прочитал много статей о том, как использовать INI-файл в моем проекте VB6. У меня нет проблем с методами, моя проблема в том, как заставить файл EXE найти файл INI. Я не хочу жестко кодировать путь в программе. Я просто хочу, чтобы EXE-файл ожидал, что INI-файл будет находиться в той же папке, из которой выполняется EXE-файл.

Когда я запускаю программу из среды IDE VB6, INI обнаруживается и обрабатывается. Когда я компилирую программу и запускаю EXE, ничего не найдено.

Мой код выглядит так:

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

, где TOOLBOM - это [Раздел], а "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

Ответы [ 6 ]

4 голосов
/ 26 января 2009

Боб прав, это не удастся, как только кто-нибудь попытается запустить его в Vista или позже. Записываемые файлы данных не должны помещаться в программные файлы. Теперь Windows применяет эти правила. Глобальные настройки для всех пользователей принадлежат одной папке, настройки для каждого пользователя - в другой, настройки роуминга для каждого пользователя - и т. Д.

Эта статья Visual Studio Magazine Карла Петерсона дает некоторый код VB6, который вы можете поместить в свой проект, чтобы найти расположение этих папок во время выполнения. И затем эта предыдущая статья того же автора дает вам хороший класс для использования INI-файлов, чтобы скрыть эти объявления API.

4 голосов
/ 23 января 2009

В VB6 вы можете использовать App.Path, чтобы указать путь к файлам, которые должны находиться в каталоге, из которого вы выполняете. например,

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

Какую ошибку вы получаете?

1 голос
/ 24 января 2009

Это потерпит неудачу, как только кто-нибудь попытается запустить его в Vista или более поздней версии.

Записываемые файлы данных не должны входить в Program Files. Так как люди все равно это делали, Windows начала применять правила, начиная с Vista.

Глобальные настройки находятся в папке приложения в CommonAppData, настройки для каждого пользователя находятся ниже LocalAppData, настройки роуминга для каждого пользователя в AppData и т. Эти местоположения извлекаются во время выполнения с помощью объекта Shell или вызовов API.

0 голосов
/ 10 июня 2010

Храните EXE в той же папке

0 голосов
/ 16 января 2010

app.path будет возвращать путь к исполняемому в настоящий момент исполняемому файлу, используйте его

0 голосов
/ 24 января 2009

Вы захотите использовать FileSystemObject из среды исполнения Scripting для правильного объединения путей и имен файлов. Хотя в действительности это может показаться тривиальной проблемой, существуют угловые случаи, которые обрабатывает FileSystemObject.

...