1

VB6 プロジェクト内で INI ファイルを使用する方法に関する多くの記事を読みました。メソッドに問題はありません。私の問題は、EXE ファイルで INI ファイルを見つける方法です。プログラムでパスをハードコーディングしたくありません。EXE が実行されるのと同じフォルダに INI ファイルが存在することを EXE に期待させるだけです。

VB6 IDE 内からプログラムを実行すると、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
4

6 に答える 6

4

ボブは正しいです。Vista以降で誰かが実行しようとするとすぐに失敗します。書き込み可能なデータファイルは、プログラムファイルに入れることは想定されていません。Windowsはこれらのルールを適用するようになりました。すべてのユーザーのグローバル設定は1つのフォルダーに属し、ユーザーごとの設定は別のフォルダーに属し、ユーザーごとのローミング設定は別のフォルダーに属します。

KarlPetersonによるこのVisualStudioMagazineの記事では、プロジェクトにドロップして実行時にこれらのフォルダーの場所を見つけることができるVB6コードをいくつか紹介しています。そして、同じ著者によるこの以前の記事では、これらのAPI宣言を隠すために、INIファイルを使用するための優れたクラスを提供しています。

于 2009-01-26T17:39:04.290 に答える
4

VB6 では、App.Path を使用して、実行元のディレクトリにあるファイルへのパスを指定できます。例えば

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

あなたが得ているエラーは何ですか?

于 2009-01-23T04:00:51.270 に答える
1

ただし、Vista以降で誰かが実行しようとすると、これは失敗します。

書き込み可能なデータファイルは、プログラムファイルに入れられることは想定されていません。とにかく人々がそれをしたので、WindowsはVistaから始まる規則を施行し始めました。

グローバル設定はCommonAppDataの下のアプリケーションフォルダーに属し、ユーザーごとの設定はLocalAppDataの下にあり、AppDataの下のローミング設定を使用するなどです。これらの場所は、実行時にシェルオブジェクトまたはAPI呼び出しを介して取得されます。

于 2009-01-23T22:57:10.663 に答える
0

EXEを同じフォルダに保存します

于 2010-06-10T09:00:09.383 に答える
0

app.pathは、現在実行中のexeのパスを返します。

于 2010-01-16T10:07:24.733 に答える
0

スクリプトランタイムのFileSystemObjectを使用して、パスとファイル名を適切に組み合わせることができます。実際には些細な問題に思えるかもしれませんが、FileSystemObjectが処理するコーナーケースがあります。

于 2009-01-24T04:43:56.143 に答える