現在、既存のVb6プロジェクトにWindows 7のサポートを追加しています.Vistaで始まるWindowsバージョンではサポートされていないSHGetFolderPathを使用して特別なフォルダパスを見つける問題が発生しました。私はSHGetKnownFolderPathを使用すべきであることを知っていますが、VB6でSHGetKnownFolderPath APIコールを使用して実装した良い例は見つかりません。SHGetKnownFolderPath関数をVb6から使用する方法
答えて
使いやすいShell object Microsoftはこのオブジェクトとの互換性に注意していないため、後でバインドすることをお勧めします。
Const ssfCOMMONAPPDATA = &H23
Const ssfLOCALAPPDATA = &H1c
Const ssfAPPDATA = &H1a
Dim strAppData As String
strAppData = _
CreateObject("Shell.Application").NameSpace(ssfAPPDATA).Self.Path
私はコードのシンプルさが好きです。 –
NameSpaceのid値https://msdn.microsoft.com/en-us/library/windows/desktop/bb774096(v=vs.85).aspx – eddyparkinson
コードを使用して、モジュールWINAPI32.bas
Private Declare Function SHGetSpecialFolderLocation Lib "shell32.dll" _
(ByVal hwndOwner As Long, ByVal nFolder As Long, _
pidl As ITEMIDLIST) As Long
Private Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long
Private Type SHITEMID
cb As Long
abID As Byte
End Type
Private Type ITEMIDLIST
mkid As SHITEMID
End Type
の上部にAPI呼び出しを宣言以下、この記事vba/vb6 は、新しい公開機能を追加しました:
Public Function SHGetSpecialFolderLocationVB(ByVal lFolder As Long) As String
Dim lRet As Long, IDL As ITEMIDLIST, sPath As String
lRet = SHGetSpecialFolderLocation(100&, lFolder, IDL)
If lRet = 0 Then
sPath = String$(512, chr$(0))
lRet = SHGetPathFromIDList(ByVal IDL.mkid.cb, ByVal sPath)
SHGetSpecialFolderLocationVB = Left$(sPath, InStr(sPath, chr$(0)) - 1)
Else
SHGetSpecialFolderLocationVB = vbNullString
End If
End Function
は、新たな機能を追加しましたWindowsのバージョンがVista以上であることを確認する
Public Function IsVistaOrHigher() As Boolean
Dim osinfo As OSVERSIONINFO
Dim retvalue As Integer
Dim bVista As Boolean
bVista = False
osinfo.dwOSVersionInfoSize = 148
osinfo.szCSDVersion = Space$(128)
retvalue = GetVersionExA(osinfo)
If osinfo.dwPlatformId = 2 Then
If osinfo.dwMajorVersion >= 6 Then
bVista = True
End If
End If
IsVistaOrHigher = bVista
End Function
SHGetFolderPathを呼び出す前のメソッドを変更しました
Public Function SHGetFolderPathVB(ByVal lFolder As Long) As String
Dim path As String
If IsVistaOrHigher() Then
SHGetFolderPathVB = SHGetSpecialFolderLocationVB(lFolder)
Else
path = Space$(MAX_PATH)
SHGetFolderPath 0, lFolder, 0, SHGFP_TYPE_CURRENT, path
SHGetFolderPathVB = Left(path, InStr(path, vbNullChar) - 1)
End If
End Function
素晴らしいです!
dwMajorVersion> 6のときにうまく動作しない場合は、osinfo.dwMajorVersion> = 6をテストするだけで、Windows 9xはdwMajorVersion = 4で停止しているため、dwPlatformIdテストを気にする必要はありません。 –
良いキャッチ。ありがとう。 –
shfolder.dll
からSHGetFolderPath
を使用するだけVistaとWin7の下に正常に動作します:
Private Declare Function SHGetFolderPath Lib "shfolder" Alias "SHGetFolderPathA" (ByVal hWnd As Long, ByVal csidl As Long, ByVal hToken As Long, ByVal dwFlags As Long, ByVal szPath As String) As Long
次に、これらのCSIDL_Xxx
定数に列挙型を宣言します。
Public Function GetSpecialFolder(ByVal eType As MySpecialFolderType) As String
GetSpecialFolder = String(1000, 0)
Call SHGetFolderPath(0, eType, 0, 0, GetSpecialFolder)
GetSpecialFolder = Left$(GetSpecialFolder, InStr(GetSpecialFolder, Chr$(0)) - 1)
End Function
私はこれを知らなかった!ありがとう。 –
- 1. VB6 EXE関数をC#から呼び出す方法
- 2. VB.NetのVB6からDLL/TLBを使用する方法
- 3. VB6からColdfusion webserviceを使用する
- 4. VB6 + VB6アプリケーションからLinuxマシンのスクリプトをexeする方法
- 5. require()を使用して別のファイルから関数を使用する方法
- 6. VB6を使用してHTMLからコンテンツを取得する方法
- 7. vb6の関数にオブジェクトを渡す方法
- 8. VB6に関数別名を指定する方法がありますか?
- 9. 目的関数cでasin()関数を使用する方法
- 10. CDOでグループメールを作成する方法VB6を使用する
- 11. 関数がローカル変数を使用する別のクラスから関数を呼び出す方法
- 12. 配列を使用してPHP関数から値を取得する方法
- 13. PHP関数の引数で変数を使用する方法?
- 14. Microsoft Office AccessのサブフォームコントロールをVB6フォームで使用する方法?
- 15. vb6のinetでプロキシを使用する方法は?
- 16. C#:テキストボックスから関数に数学関数を渡す方法
- 17. Cで、共有ライブラリファイルのメインプログラムファイルから関数を使用する方法
- 18. AWS Lambda:Javaを使用してLambda関数からS3バケットにアクセスする方法
- 19. 別のデータベースからのSQLでユーザー定義関数を使用する方法
- 20. 関数から返された値を使用して検索する方法
- 21. vb6のSUM関数を使用して配列の要素を合計する
- 22. linuxのリンクレジスタ(backtrace_symbolなど)を使用して関数アドレスから関数名を取得する方法
- 23. コールバック関数から他のコールバック関数にコールする方法
- 24. Openrowset関数を使用してExcelから値を読み取る方法は?
- 25. VB6でランダム化関数
- 26. Xpath "contains"関数で変数node-setを使用する方法
- 27. 関数内で変数を使用する方法
- 28. system()関数内でC++変数を使用する方法
- 29. 複数の画像にjQuery関数を使用する方法
- 30. ワークフロー内の関数から関数を呼び出す方法
私は最終的に例を見つけました。 http://en.kioskea.net/faq/951-vba-vb6-my-documents-environment-variables –
この質問に似ていますhttp://stackoverflow.com/questions/4273424/where-should-i-store-アプリケーション固有の設定/ 4275821 – MarkJ