String型を返すWindows APIのラッパ

返信する


答えを正確に入力してください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: String型を返すWindows APIのラッパ

by イグトランス » 2006年9月29日(金) 09:55

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日修正しました。

IDListとSHBrowseForFolder

by イグトランス » 2006年6月13日(火) 17:06

次はIDListからパス文字列へ変換するSHGetPathFromIDListのラッパ、IDListToPathStrと
それを使ってフォルダ選択ダイアログの結果をStringで返すBrowseForFolder_Strです。
なんの面白みも無いですが,使用例です。

コード: 全て選択

Dim folderPath As String
folderPath = BrowseForFolder_Str(hMainWnd, "フォルダの選択", BIF_RETURNONLYFSDIRS)
MessageBox(hMainWnd, StrPtr(folderPath), "選択したフォルダのパス", MB_OK)
BrowseForFolder_Strは最初の引数がウィンドウハンドル,次にダイアログのタイトル,最後にフラグ指定の引数としました。

by イグトランス » 2006年6月13日(火) 15:32

というわけで,まずはDragQueryFileのString版,
DragQueryFileStrです。
ようするにGetStr_GetLenProcは文字列の長さを返す関数で,
GetStr_GetStrProcは実際に文字列を得てさらに新たな長さを返すような関数であればよいのです。
そうすればGetStringがZeroStringを呼んだり文字列の長さを調整したりなどといった雑用をこなしてくれます。

String型を返すWindows APIのラッパ

by イグトランス » 2006年6月13日(火) 15:26

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に対応させました。

ページトップ