次の方法で共有

Windows7でACCESS2007モジュールでGetProfileStringを使うと、VirtualStoreにアクセスしない

Anonymous
2011-09-30T03:25:48+00:00

こんにちは、

VB6とACCESS2000のレガシーアプリを、Windows7対応しようと動作確認しています。

Windows7ではACCESS2007Runtime環境です。

そのアプリでは、Windowsフォルダー配下に INIファイル があり、VB6とACCESSのプログラムからkernel32のGetProfileStringで読み・書きしております。

UACを既定の状態にしていると、

C:\Users\ ユーザ名 \AppData\Local**VirtualStore**Windows

にあるINIファイルを 

C:Windows より優先してGetProfileString で読むと思うのです。

VB6のプログラムでは、上記のような動きとなりますが、

ACCESSのプログラムでは、常にC:\Windows配下のINIファイルを読みます。

ACCESSのプログラムから、VirtulaStore\Windows 配下のINIファイルを読むことはできないのでしょうか?

いろいろWEBを探したのですが、この件に関する情報は見つけることができませんでした。

UACを無効にするのも手ですが、それ以外の方法を探しています。

どなたかご回答よろしくお願いします。

プログラムは以下のようなものです。

ACCESSフォーム

=======================

Option Compare Database

Private Sub btnTest_Click()

On Error GoTo Err_btnTest_Click

    Dim IniPath As String

    IniPath = GetWinDir() & "\sample.ini"

    MsgBox GetIniString("SECTION", "DATA", "Not Find", 255, IniPath)

Exit_btnTest_Click:

    Exit Sub

Err_btnTest_Click:

    MsgBox Err.Description

    Resume Exit_btnTest_Click

End Sub

=======================

ACCESSモジュール

=======================

Option Compare Database

Public Declare Function getwindowsdirectory Lib "kernel32" Alias "GetWindowsDirectoryA" _

        (ByVal lpBuffer As String, _

        ByVal nSize As Long) As Long

Public 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

Public Function GetWinDir() As String

    Dim lSize       As Long

    Dim lReturn     As Long

    Dim cnt1        As Integer

    Dim cWindir     As String       'Windowsフォルダ名の格納

    cWindir = Space(255)

    lSize = 255

    lReturn = getwindowsdirectory(cWindir, lSize)

    cnt1 = InStr(cWindir, Chr(&H0))

    If (cnt1 > 0) Then

      cWindir = Left(cWindir, cnt1 - 1)

    End If

    GetWinDir = cWindir

End Function

Public Function GetIniString(sSection As String, sKey As String, _

                            sDefault As String, lSize As Long, sFileName As String) As String

    Dim llLen As Long

    Dim lsReturn As String

    lsReturn = Space(lSize + 1)

    llLen = GetPrivateProfileString(sSection, sKey, sDefault, lsReturn, lSize + 1, sFileName)

    GetIniString = Mid(lsReturn, 1, llLen)

End Function

=======================

INI (C:\windows\sample.ini)

=======================

[SECTION]

DATA=999

=======================

INI (C:\Users\ ユーザ名 \AppData\Local**VirtualStore**Windows\sample.ini)

=======================

[SECTION]

DATA=AAAAA

上記の場合、

VBでは、 AAAAA を読み、

ACCESSでは、 999 を読みます。

よろしくお願いします。

Microsoft 365 と Office | アクセス | 家庭向け | Windows

ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。

0 件のコメント コメントはありません

2 件の追加の回答

並べ替え方法: 最も役に立つ
  1. Anonymous
    2011-09-30T13:59:14+00:00

    レスポンスありがとうございます。

    パスを指定してみるようにすると、UACの設定(レジストリ)を読みに行ってそれによって見るパスを変えるってことになるんでしょうね。それならUACをオフにしたほうが楽ですね。

    UACの設定に従って、GetPrivateProfileStringがACCESS2007のVBAでは正しくVirtualStoreを見てないという指摘で、個人的にはバグっぽいなぁと思っているんですが。OS(Windows7)なんだか、ACCESSなんだか、VBAなんだかわからず、この板に投稿しました。

    他の板を御紹介いただきありがとうございました。

    投稿してみます。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません
  2. Anonymous
    2011-09-30T09:12:19+00:00

    肥田 さん、こんにちは。

    Answers への投稿、ありがとうございます。

    INI ファイルを参照するときに、Access のプログラムから Visual Basic (VB) が読込にいくフォルダーを参照することができないかということでね。

    VB と同じ場所の INI ファイルを読みに行くような設定がないか調べてみたのですが、見つけることはできませんでした。Access の設定に変わる代替案となってしまいますが、「VirtulaStore\Windows」のパスを指定して同じフォルダーの INI を見に行くようにしてはどうでしょうか。

    VB または VBA に関する質問の場合、カテゴリが存在しないため Answers ではなかなか情報が集まりにくいのではと思います。こちらの MSDN の **VB** もしくは **VBA** のフォーラムにご投稿いただくとより情報が集まってくるかもしれません。

    今後とも Answers をよろしくお願いします。

    この回答は役に立ちましたか?

    0 件のコメント コメントはありません