フォルダ選択ダイアログの説明文のUnicode文字表示について

解決


ウィング  2006-04-11 07:12:13  No: 95020

VB6SP6、WindowsXPで開発を行っています。

フォルダ選択画面の説明文にUnicode文字を表示したいのですが、
うまくいきません。
わかる方いらっしゃいましたら、教えてください。
質問ばかりですみません。

フォルダ選択ダイアログのUnicodeフォルダパスの取得についての質問
でStringではなく、Byteを使用するということを教えていただいたので
応用してやってみたのですが、表示すると下記のような説明文が表示
されてしまいます。
%s
更新日時:%s

下記がやってみたコードです。

'ブラウザ情報構造体
Private Type BROWSEINFO
    hWndOwner       As Long
    pidlRoot        As Long
    pszDisplayName  As Byte
    lpszTitle       As Byte
    ulFlags         As Long
    lpfn            As Long
    lParam          As Byte
    iImage          As Long
End Type

Dim abytTitle()  As Byte
Dim abytDisplayName() As Byte
Dim lngpid      As Long

ReDim abytDisplayName(0 To 259) As Byte

abytTitle = vstrCaption & vbNullChar   ' 表示する説明文

With typBinfo
    .hWndOwner = vlngOwnerHwnd            ' 親のウィンドウハンドル
    .pidlRoot = 0
    .pszDisplayName = abytDisplayName(0&) 
    .lpszTitle = abytTitle(0&)            ' 表示する説明文
    .ulFlags = vlngFlags           
End With

' フォルダー選択ダイアログを表示
lngpid = SHBrowseForFolder(typBinfo)


あっきー  2006-04-11 08:38:22  No: 95021

どこで見たのか知りませんが

Private Type BROWSEINFO
    hWndOwner       As Long
    pidlRoot        As Long
    pszDisplayName  As Byte
    lpszTitle       As Byte
    ulFlags         As Long
    lpfn            As Long
    lParam          As Byte
    iImage          As Long
End Type

これ無茶苦茶ですよ。


あっきー  2006-04-11 08:42:00  No: 95022

すみません。途中で送信してしまいました。

独学もいいけど、せっかくネットができる環境なんだから
検索しましょう。

サンプルは山ほどありますよ。

http://www.google.com/search?num=50&hl=ja&q=VB+BROWSEINFO&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja


ウィング  2006-04-11 18:09:34  No: 95023

回答ありがとうございます。

あっきーさんの言われた、URLの1番最初のリンクおよび
2番目のリンクのページをみたのですが、こちらのサンプルソース
ですと、説明文に日本語は表示できるみたいですが、
中国語・タイ語は表示できないみたいです。

私がやりたいのは、Unicode文字(中国語・タイ語)を表示したいのです。
例えば、เปลี่ยน のような文字とかです。

よろしくお願いします。


K.J.K.  2006-04-11 18:25:27  No: 95024

pszDisplayNameとlpszTitleはAs Longで。
lParamもインスタンスに関連付けないのならばAs Longが無難かと。
# 関連付けてもObjPtrがあるからAs Longで行けますし。

んで、前回の応用でこんな感じでは。

Dim uInfo As BROWSEINFO
Dim abDisplayName() As Byte
Dim abTitle() As Byte
Dim sDisplayName As String
Dim sTitle As String

' この段階でsDisplayNameとsTitleには有効な文字列が
' 格納されるとする。

abDisplayName = sDisplayName & vbNullChar
abTitle = sTitle & vbNullChar
ReDim Preserve abDisplayName(0& To 519&) As Byte
' 文字列の長さがMAX_PATH(260)であるとされる(MSDNより)から。

uInfo.pszDisplayName = VarPtr(abDisplayName(0&))
uInfo.abTitle = VarPtr(abTitle(0&))

' ここでSHBrowseForFolderを呼んでいるとする。

sDisplayName = abDisplayName & vbNullChar
' ここでvbNullChar以下を切り捨てる処理。


ウィング  2006-04-11 19:07:52  No: 95025

回答ありがとうございます。

すごい!!できました!!
K.J.K.さん とても詳しいですね。

恥ずかしながらVarPtr関数というものを知りませんでした・・。
VarPtrをMSDNライブラリで検索してみたんですが、載ってないし・・^^;
HPで検索したら、変数のアドレスを取得する関数というので見つかりました。
大変勉強になりました。
ありがとうございました。

解決ということで、下記にソースコードを掲載しておきます。

'フォルダ選択ダイアログを表示
Private Declare Function SHBrowseForFolder Lib "shell32" Alias "SHBrowseForFolderW" (lpbi As BROWSEINFO) As Long

'ブラウザ情報構造体
Private Type BROWSEINFO
    hWndOwner       As Long
    pidlRoot        As Long
    pszDisplayName  As Long
    lpszTitle       As Long
    ulFlags         As Long
    lpfn            As Long
    lParam          As Long
    iImage          As Long
End Type

Dim typBinfo        As BROWSEINFO   ' フォルダ情報構造体
Dim abTitle()       As Byte         ' タイトル
Dim abDispName()    As Byte         ' 表示名称

abDispName = vbNullChar

ReDim Preserve abDispName(0& To 519&) As Byte

' 説明文を設定
abTitle = vstrCaption & vbNullChar
    
'BROWSEINFO 構造体設定
With typBinfo
    .hWndOwner = vlngOwnerHwnd               ' 親ウィンドウのハンドル
    .pszDisplayName = VarPtr(abDispName(0&))
    .lpszTitle = VarPtr(abTitle(0&)) 
    .ulFlags = vlngFlags
End With

' フォルダー選択ダイアログを表示
lngpid = SHBrowseForFolder(typBinfo)


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加