String型を返すWindows APIのラッパ

オープンソース形式でコードを共有するフォーラムです。お役立ちコード、あなたも投稿してみませんか?
返信する
メッセージ
作成者
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

String型を返すWindows APIのラッパ

#1 投稿記事 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に対応させました。
最後に編集したユーザー イグトランス [ 2006年9月29日(金) 09:45 ], 累計 1 回
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#2 投稿記事 by イグトランス »

というわけで,まずはDragQueryFileのString版,
DragQueryFileStrです。
ようするにGetStr_GetLenProcは文字列の長さを返す関数で,
GetStr_GetStrProcは実際に文字列を得てさらに新たな長さを返すような関数であればよいのです。
そうすればGetStringがZeroStringを呼んだり文字列の長さを調整したりなどといった雑用をこなしてくれます。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

IDListとSHBrowseForFolder

#3 投稿記事 by イグトランス »

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

コード: 全て選択

Dim folderPath As String
folderPath = BrowseForFolder_Str(hMainWnd, "フォルダの選択", BIF_RETURNONLYFSDIRS)
MessageBox(hMainWnd, StrPtr(folderPath), "選択したフォルダのパス", MB_OK)
BrowseForFolder_Strは最初の引数がウィンドウハンドル,次にダイアログのタイトル,最後にフラグ指定の引数としました。
イグトランス
記事: 899
登録日時: 2005年5月31日(火) 17:59
お住まい: 東京都
連絡する:

#4 投稿記事 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日修正しました。
返信する