none
%APPDATA% 上の ini ファイルを GetPrivateProfileString で参照すると古い ini ファイルが参照される RRS feed

  • 質問

  • 問題が発生している環境は下記の通りです。

    ・Windows 10 Pro 64bit 1903 18362.175
    ・Office Personal 2016 バージョン 1905 (ビルド 11629.20246 Microsoft Store)

    再現手順は、

    1) 下記 ini ファイルを %APPDATA%\test に配置します。

    -- test.ini
    [SECTION]
    DATA=AAA
    --

    2) 下記マクロをEXCEL VBAに記述します。

    Private 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 Sub ShowTest()
        Dim s As String
        s = CreateObject("WScript.Shell").SpecialFolders("AppData") & "\test\test.ini"
        MsgBox GetINI("SECTION", "DATA", s)
    End Sub
    
    Private Function GetINI(ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpFileName As String) As String
        Dim lpReturnedString As String
        Dim Result As Long
        lpReturnedString = Space$(255)
        Result = GetPrivateProfileString(lpApplicationName, lpKeyName, "", lpReturnedString, 255, lpFileName)
        GetINI = Left(lpReturnedString, Result)
    End Function
    
    3) ShowTest 関数を実行すると「AAA」と表示されます。

    4) ini ファイルを下記の通り「AAA」から「BBB」に変更します。

    -- test.ini
    [SECTION]
    DATA=BBB
    --

    5) 再度 ShowTest 関数を実行すると「BBB」と表示されず、「AAA」と表示されます。

    4) で ini ファイルの内容を変更しているにも関わらず、5) で変更前の値が参照されるのは何故でしょうか?

    なお、%APPDATA% 上ではなく、例えば「C:\Temp」等に ini ファイルを配置すると「BBB」と表示されます。
    最悪ケースとして %APPDATA% 上の ini ファイルを一時フォルダ等にコピーしてから参照しようと考えております。
    他に回避方法がないかご教示頂ければ幸いです。

    よろしくお願いします。
    2019年6月19日 8:53

回答

  • ・Office Personal 2016 バージョン 1905 (ビルド 11629.20246 Microsoft Store)

    ストアアプリ版のOfficeの場合、%APPDATA% とレジストリはリダイレクトされ、Office以外の環境で変更したファイルは参照されません。

    それが原因ではないでしょうか?

    OSの仕様(DesktopBridgeと呼ばれる仕組み)に起因する問題で、リダイレクト先のファイルを外部から参照する方法はないので、Officeアプリの中から修正しない限り変更が反映されることはありません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク twinbird827 2019年6月20日 9:50
    2019年6月19日 11:27

すべての返信

  • 20年前のKBで既にMicrosoftのサイトからも消えていますが、キャッシュをフラッシュする方法として Q68827: Updating Cached Private Profiles (.INI Files)

    To force an .INI file to be recached, make the following call (where <fname.ini> is the name of the application's private profile):

         WritePrivateProfileString(NULL, NULL, NULL, <fname.ini>)

    とありました。

    GetPrivateProfileString関数で iniファイルが読込めない

    2019年6月19日 9:06
  • ・Office Personal 2016 バージョン 1905 (ビルド 11629.20246 Microsoft Store)

    ストアアプリ版のOfficeの場合、%APPDATA% とレジストリはリダイレクトされ、Office以外の環境で変更したファイルは参照されません。

    それが原因ではないでしょうか?

    OSの仕様(DesktopBridgeと呼ばれる仕組み)に起因する問題で、リダイレクト先のファイルを外部から参照する方法はないので、Officeアプリの中から修正しない限り変更が反映されることはありません。


    とっちゃん@わんくま同盟, Visual Studio and Development Technologies http://blogs.wankuma.com/tocchann/default.aspx

    • 回答としてマーク twinbird827 2019年6月20日 9:50
    2019年6月19日 11:27
  • 佐祐理さま、とっちゃんさま

    有益な情報をご提供頂きありがとうございました。

    1)
    GetPrivate~の直前に WritePrivateProfileString(vbNullString, vbNullString, vbNullString, lpFileName) を追加してみましたが、問題は改善されませんでした。
    ※ただし、私の環境が問題で、本当はこれで改善していたかもしれません。

    2)
    C ドライブを「test.ini」で検索したところ下記フォルダにファイルがありました。

    C:\Users\%USERNAME%\AppData\Local\Packages\Microsoft.Office.Desktop_8wekyb3d8bbwe\LocalCache\Roaming\test

    このファイルは、私が最初に投稿した内容のうち、1) のiniファイルと同一ファイルでした。
    ファイルをエクスプローラから削除し、再度 ShowTest を実行すると「BBB」と表示されました。

    とっちゃんさまのご指摘どおり、最初のGetPrivate~でファイルがリダイレクトされ、以降はリダイレクトされたファイルを参照していたため、問題が発生していたようです。

    3)
    ここからは謝罪の内容になりますが。。。
    問題が発生していた実際の環境は、実は Win 10 の 1803 でした。

    投稿にあたって、OS のバージョンを最新にしておいたほうが良いかと思い、バージョンを最新にしていました。
    最新にした後も同じ手順で問題が再現したのでOSバージョンの違いによる動作の差異はないと判断していましたが、実際は差異があるようです。

    差異とは、OS 1803 ではGetPrivate~で対象ファイルがリダイレクトされますが、OS 1903 ではリダイレクトされませんでした。
    ただ、元々リダイレクトされたファイルがある場合は 1903 でもそちらのファイルを優先するようです。
    なので、以前のバージョンでリダイレクトされたファイルを何らかの手段で削除すれば、OS 1903 では最初に投稿した手順では、実際は再現しなかったみたいです。すみませんでした。

    他にも色々差異があったみたいで、実際使っていたマクロや周辺のバッチ等が全然動かなくなってました。
    同じWin10でも1年変わると別物になるんですね。

    別の問題が発生してしまったのでそれは情報まとめて別の機会に質問したいと思いますが、本件につきましてはリダイレクトが原因だと分かりましたのでこのスレッドはクローズしたいと思います。
    ありがとうございました。

    2019年6月20日 9:50