ページ 1 / 1
String型を返すWindows APIのラッパ
Posted: 2006年6月13日(火) 15:26
by イグトランス
GetWindowTextStrやGetDlgItemStrの要領で文字列を結果として返すラッパを投稿していきます。
コード: 全て選択
TypeDef GetStr_GetLenProc = *Function(pv As VoidPtr) As DWord
TypeDef GetStr_GetStrProc = *Function(pv As VoidPtr, buf As *Byte, len As DWord) As DWord
Function GetString(pv As VoidPtr, pfnGetLen As GetStr_GetLenProc, pfnGetStr As GetStr_GetStrProc) As String
Dim len As DWord
len = pfnGetLen(pv)
If len = 0 Then Exit Function
GetString = ZeroString(len)
len = pfnGetStr(pv, StrPtr(GetString), len)
#ifdef _AB_VER5
GetString.Length = len
#else
SetDWord(StrPtr(GetString) - SizeOf (DWord), len)
#endif
End Function
本来ならクラスを使ってやりたいところですが,抽象メンバ関数が無いので,通常の関数と関数ポインタを使っていますが,
それさえ目をつぶればテンプレートメソッドパターンになっているはずです。
とにかくこれ単独で使うのではなく,実際のラッパは次以降です。
2006/09/29 AB5に対応させました。
Posted: 2006年6月13日(火) 15:32
by イグトランス
というわけで,まずはDragQueryFileのString版,
DragQueryFileStrです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
Class DragQueryInfo
Public
Sub DragQueryInfo(hDrop As HDROP, iFile As Long)
This.hDrop = hDrop
This.iFile = iFile
End Sub
hDrop As HDROP
iFile As Long
End Class
Function DragQueryFile_ForGetLen(ByRef dqi As DragQueryInfo) As DWord
With dqi
DragQueryFile_ForGetLen = DragQueryFile(.hDrop, .iFile, 0, 0)
End With
End Function
Function DragQueryFile_ForGetStr(ByRef dqi As DragQueryInfo, buf As *Byte, len As DWord) As DWord
With dqi
DragQueryFile_ForGetStr = DragQueryFile(.hDrop, .iFile, buf, len + 1)
End With
End Function
Function DragQueryFileStr(hDrop As HDROP, iFile As Long) As String
If iFile >= 0 Then
Dim dqi As DragQueryInfo(hDrop, iFile)
DragQueryFileStr = GetString(VarPtr(dqi), AddressOf (DragQueryFile_ForGetLen), AddressOf (DragQueryFile_ForGetStr))
End If
End Function
ようするにGetStr_GetLenProcは文字列の長さを返す関数で,
GetStr_GetStrProcは実際に文字列を得てさらに新たな長さを返すような関数であればよいのです。
そうすればGetStringがZeroStringを呼んだり文字列の長さを調整したりなどといった雑用をこなしてくれます。
IDListとSHBrowseForFolder
Posted: 2006年6月13日(火) 17:06
by イグトランス
次はIDListからパス文字列へ変換するSHGetPathFromIDListのラッパ、IDListToPathStrと
それを使ってフォルダ選択ダイアログの結果をStringで返すBrowseForFolder_Strです。
[ここをクリックすると内容が表示されます] [ここをクリックすると非表示にします]コード: 全て選択
'-------------------------------------------------------------------------------
' IDListToPathStr, BrowseForFolder_Str
TypeDef UINT = DWord
Type SHITEMID
cb As WORD
abID[ELM(1)] As Byte
End Type
Type ITEMIDLIST
mkid As SHITEMID
End Type
TypeDef PITEMIDLIST = *ITEMIDLIST
Function GetMaxPath(pv As VoidPtr) As DWord
GetMaxPath = MAX_PATH
End Function
Function GetPathFromIDList(pv As VoidPtr, buf As *Byte, len As DWord) As DWord
If len < MAX_PATH Then
buf[0] = 0
Exit Function
End If
SHGetPathFromIDList(pidlBrowse, buf)
GetPathFromIDList = lstrlen(buf)
End Function
Function IDListToPathStr(pidl As *ITEMIDLIST) As String
IDListToPathStr = GetString(
VarPtr(dqi),
AddressOf (GetMaxPath) As GetStr_GetLenProc,
AddressOf (GetPathFromIDList) As GetStr_GetStrProc)
End Function
Function BrowseForFolder_Str(hwnd As HWND, pszTitle As BytePtr, flags As UINT) As String
Dim bi As BROWSEINFO
'BROWSEINFO構造体の初期化
'ZeroMemory(VarPtr(bi), Len(bi))
With bi
.hwndOwner = hwnd
.lpszTitle = pszTitle
.ulFlags = flags
End With
'「フォルダの参照」ダイアログボックスを表示
Dim pidlBrowse As *ITEMIDLIST
pidlBrowse = SHBrowseForFolder(bi)
If pidlBrowse Then
BrowseForFolder_Str = IDListToPathStr(pidlBrowse)
CoTaskMemFree(pidlBrowse)
End If
End Function
なんの面白みも無いですが,使用例です。
コード: 全て選択
Dim folderPath As String
folderPath = BrowseForFolder_Str(hMainWnd, "フォルダの選択", BIF_RETURNONLYFSDIRS)
MessageBox(hMainWnd, StrPtr(folderPath), "選択したフォルダのパス", MB_OK)
BrowseForFolder_Strは最初の引数がウィンドウハンドル,次にダイアログのタイトル,最後にフラグ指定の引数としました。
Posted: 2006年9月29日(金) 09:55
by イグトランス
GetWindowTextStrの焼き直しです。GetWindowTextLengthはちょうど引数が一致するので直接渡しています。
GetWindowTextは微妙に引数が異なるので,そうは行きませんでした。
コード: 全て選択
Function GetWindowTextStr(hwnd As HWND) As String
GetWindowTextStr = GetString(hwnd,
GetProcAddress(GetModuleHandle("user32"), "GetWindowTextLengthA"),
AddressOf(GetWindowTextBufLen))
End Function
Function GetDlgItemTextStr(hDlg As HWND, idDlgItem As Long) As String
GetDlgItemTextStr = GetWindowTextStr(GetDlgItem(hDlg, idDlgItem))
End Function
Function GetWindowTextBufLen(hwnd As HWND, p As *Byte, len As Long) As Long
GetWindowTextBufLen = GetWindowText(hwnd, p, len + 1)
End Function
平成18年11月04日修正しました。