by konisi » 2008年8月14日(木) 17:19
ダイアログボックスより上に来るのがまずいウインドウのハンドル という感覚で指定してます。間違ってるかもしれませんが・・・
「使い方」にあるように、GetDesktopWindow()でもいいと思いますし、
プロジェクトならhMainWnd等でいいと思います。
でもこの「使い方」のString型の使用方法はAB3時代の物のように思えます・・・
このまま流用する時は引数bufをStrPtrでくくるか、
自信があるようならString型を使わずに*Byte型やByte型配列を用いるほうがいいと思います。
つまりAB4用だとこんな具合 [ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner As HWND,_
lpszPath As *Byte,nFolder As Long,fCreate As Long) As Long
Const CSIDL_ALTSTARTUP = &H1D ' スタートアッププログラムグループ内の特定ユーザー向けのスタートアップディレクトリ
Const CSIDL_APPDATA = &H1A ' アプリケーション定義データ用共通ディレクトリ
Const CSIDL_BITBUCKET = &H0A ' ごみ箱
Const CSIDL_COMMON_ALTSTARTUP = &H1E ' スタートアッププログラムグループ内の全ユーザー向けのスタートアップディレクトリ
Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' 全ユーザ向けデスクトップディレクトリ
Const CSIDL_COMMON_FAVORITES = &H1F ' 全ユーザ向けお気に入り
Const CSIDL_COMMON_PROGRAMS = &H17 ' 全ユーザ向けスタートメニューに表示されるプログラムグループのディレクトリ
Const CSIDL_COMMON_STARTMENU = &H16 ' 全ユーザ向けスタートメニューに表示されるプログラムとフォルダを含むのディレクトリ
Const CSIDL_COMMON_STARTUP = &H18 ' 全ユーザ向けスタートアップフォルダに含まれるプログラムを含むのディレクトリ
Const CSIDL_CONTROLS = &H03 ' コントロールパネル
Const CSIDL_DESKTOP = &H00 ' デスクトップ
Const CSIDL_DESKTOPDIRECTORY = &H10 ' Windows\デスクトップ
Const CSIDL_DRIVES = &H11 ' マイコンピュータ
Const CSIDL_FAVORITIES = &H06 ' Favorities
Const CSIDL_FONTS = &H14 ' Windows\Font
Const CSIDL_HISTORY = &H22 ' インターネット履歴ディレクトリ
Const CSIDL_INTERNET = &H01 ' インターネットフォルダ
Const CSIDL_INTERNET_CACHE = &H20 ' インターネットキャッシュのディレクトリ
Const CSIDL_NETHOOD = &H13 ' NetHoodディレクトリ
Const CSIDL_NETWORK = &H12 ' NETWORKフォルダ
Const CSIDL_PERSONAL = &H05 ' My Document
Const CSIDL_PRINTERS = &H04 ' プリンタフォルダ
Const CSIDL_PRINTERHOOD = &H1B ' プリンタディレクトリ
Const CSIDL_PROGRAMS = &H02 ' \windows\プログラム
Const CSIDL_RECENT = &H08 ' Recent
Const CSIDL_SENDTO = &H09 ' SendTo
Const CSIDL_STARTMENU = &H0B ' スタートメニュー
Const CSIDL_STARTUP = &H07 ' スタートアップ
Const CSIDL_TEMPLATES = &H15 ' Windows\ShellNew
'定数宣言ここまで
#prompt
Dim buf As *Byte
buf=malloc(MAX_PATH)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_PERSONAL,FALSE)
Print "マイドキュメント:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_DESKTOP,FALSE)
Print "デスクトップ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_FAVORITIES,FALSE)
Print "お気に入りフォルダ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_FONTS,FALSE)
Print "フォントフォルダ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_STARTUP,FALSE)
Print "スタートアップフォルダ:";MakeStr(buf)
free(buf)
ダイアログボックスより上に来るのがまずいウインドウのハンドル という感覚で指定してます。間違ってるかもしれませんが・・・
「使い方」にあるように、GetDesktopWindow()でもいいと思いますし、
プロジェクトならhMainWnd等でいいと思います。
でもこの「使い方」のString型の使用方法はAB3時代の物のように思えます・・・
このまま流用する時は引数bufをStrPtrでくくるか、
自信があるようならString型を使わずに*Byte型やByte型配列を用いるほうがいいと思います。
[hide=つまりAB4用だとこんな具合][code]Declare Function SHGetSpecialFolderPath Lib "shell32.dll" Alias "SHGetSpecialFolderPathA" (hwndOwner As HWND,_
lpszPath As *Byte,nFolder As Long,fCreate As Long) As Long
Const CSIDL_ALTSTARTUP = &H1D ' スタートアッププログラムグループ内の特定ユーザー向けのスタートアップディレクトリ
Const CSIDL_APPDATA = &H1A ' アプリケーション定義データ用共通ディレクトリ
Const CSIDL_BITBUCKET = &H0A ' ごみ箱
Const CSIDL_COMMON_ALTSTARTUP = &H1E ' スタートアッププログラムグループ内の全ユーザー向けのスタートアップディレクトリ
Const CSIDL_COMMON_DESKTOPDIRECTORY = &H19 ' 全ユーザ向けデスクトップディレクトリ
Const CSIDL_COMMON_FAVORITES = &H1F ' 全ユーザ向けお気に入り
Const CSIDL_COMMON_PROGRAMS = &H17 ' 全ユーザ向けスタートメニューに表示されるプログラムグループのディレクトリ
Const CSIDL_COMMON_STARTMENU = &H16 ' 全ユーザ向けスタートメニューに表示されるプログラムとフォルダを含むのディレクトリ
Const CSIDL_COMMON_STARTUP = &H18 ' 全ユーザ向けスタートアップフォルダに含まれるプログラムを含むのディレクトリ
Const CSIDL_CONTROLS = &H03 ' コントロールパネル
Const CSIDL_DESKTOP = &H00 ' デスクトップ
Const CSIDL_DESKTOPDIRECTORY = &H10 ' Windows\デスクトップ
Const CSIDL_DRIVES = &H11 ' マイコンピュータ
Const CSIDL_FAVORITIES = &H06 ' Favorities
Const CSIDL_FONTS = &H14 ' Windows\Font
Const CSIDL_HISTORY = &H22 ' インターネット履歴ディレクトリ
Const CSIDL_INTERNET = &H01 ' インターネットフォルダ
Const CSIDL_INTERNET_CACHE = &H20 ' インターネットキャッシュのディレクトリ
Const CSIDL_NETHOOD = &H13 ' NetHoodディレクトリ
Const CSIDL_NETWORK = &H12 ' NETWORKフォルダ
Const CSIDL_PERSONAL = &H05 ' My Document
Const CSIDL_PRINTERS = &H04 ' プリンタフォルダ
Const CSIDL_PRINTERHOOD = &H1B ' プリンタディレクトリ
Const CSIDL_PROGRAMS = &H02 ' \windows\プログラム
Const CSIDL_RECENT = &H08 ' Recent
Const CSIDL_SENDTO = &H09 ' SendTo
Const CSIDL_STARTMENU = &H0B ' スタートメニュー
Const CSIDL_STARTUP = &H07 ' スタートアップ
Const CSIDL_TEMPLATES = &H15 ' Windows\ShellNew
'定数宣言ここまで
#prompt
Dim buf As *Byte
buf=malloc(MAX_PATH)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_PERSONAL,FALSE)
Print "マイドキュメント:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_DESKTOP,FALSE)
Print "デスクトップ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_FAVORITIES,FALSE)
Print "お気に入りフォルダ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_FONTS,FALSE)
Print "フォントフォルダ:";MakeStr(buf)
SHGetSpecialFolderPath(GetDesktopWindow(),buf,CSIDL_STARTUP,FALSE)
Print "スタートアップフォルダ:";MakeStr(buf)
free(buf)[/code][/hide]