使いやすいように設計された Microsoft リレーショナル データベース管理システムのファミリ。
MSDNのVBAのフォーラムで回答をいただきました。
http://social.msdn.microsoft.com/Forums/ja-JP/vbajp/thread/19732f3a-369a-462a-825b-9e8e001b5920
私の誤解でした。ありがとうございました。
このブラウザーはサポートされなくなりました。
Microsoft Edge にアップグレードすると、最新の機能、セキュリティ更新プログラム、およびテクニカル サポートを利用できます。
こんにちは、
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 リレーショナル データベース管理システムのファミリ。
ロックされた質問。 この質問は、Microsoft サポート コミュニティから移行されました。 役に立つかどうかに投票することはできますが、コメントの追加、質問への返信やフォローはできません。
質問作成者が受け入れた回答
MSDNのVBAのフォーラムで回答をいただきました。
http://social.msdn.microsoft.com/Forums/ja-JP/vbajp/thread/19732f3a-369a-462a-825b-9e8e001b5920
私の誤解でした。ありがとうございました。
レスポンスありがとうございます。
パスを指定してみるようにすると、UACの設定(レジストリ)を読みに行ってそれによって見るパスを変えるってことになるんでしょうね。それならUACをオフにしたほうが楽ですね。
UACの設定に従って、GetPrivateProfileStringがACCESS2007のVBAでは正しくVirtualStoreを見てないという指摘で、個人的にはバグっぽいなぁと思っているんですが。OS(Windows7)なんだか、ACCESSなんだか、VBAなんだかわからず、この板に投稿しました。
他の板を御紹介いただきありがとうございました。
投稿してみます。
肥田 さん、こんにちは。
Answers への投稿、ありがとうございます。
INI ファイルを参照するときに、Access のプログラムから Visual Basic (VB) が読込にいくフォルダーを参照することができないかということでね。
VB と同じ場所の INI ファイルを読みに行くような設定がないか調べてみたのですが、見つけることはできませんでした。Access の設定に変わる代替案となってしまいますが、「VirtulaStore\Windows」のパスを指定して同じフォルダーの INI を見に行くようにしてはどうでしょうか。
VB または VBA に関する質問の場合、カテゴリが存在しないため Answers ではなかなか情報が集まりにくいのではと思います。こちらの MSDN の **VB** もしくは **VBA** のフォーラムにご投稿いただくとより情報が集まってくるかもしれません。
今後とも Answers をよろしくお願いします。