タイトル : Re^13: ファイルパスの機種依存文字を取得する方法について 投稿日 : 2014/12/11(Thu) 19:18 投稿者 : 魔界の仮面弁士
> 忘れていました。イミディエイトウィンドウには、 > 33A5 > 3F > と表示されます。Hex(bin(0))は「?」になってません。 > 「3F」の意味は文字化け? ChrW(&H33A5) は、「立方メートル記号」ですし、 ChrW(&H3F) は、「(半角の)疑問符記号」、いわゆるクエスチョンマークです。 本当に "?" という文字を扱おうとしているのなら、3F で問題ありませんが、 それ以外の文字が 3F と出力されているとしたら、データ破損確定です。 そもそも今回の案件で、vbFromUnicode や vbUnicode の出番は無いはずです。 > > 表示させようとしている文字列を下記のプロシージャに渡してみて、 > > どのような内容がイミディエイトに表示されるか、教えていただけ無いでしょうか。 > *** 文字数: 1 > 6126 > ================================= ChrW(&H2661) ということは、「白抜きハートマーク」の文字ですね。 U+2661 'WHITE HEART SUIT' http://www.fileformat.info/info/unicode/char/2661/index.htm まず、表示させようとしている文字がハートマーク記号であるかどうかを確認して下さい。 ハートマークで無いのだとしたら、この String データはすでに破損していることになります。 データ自体は 61,26 のハート文字で正しいけれども、それを表示させると「半角中点」に化けるのであれば、 ・Unicode 非対応な方法で表示させようとしている。 ・Unicode 対応の API に渡しているが、呼び出しのコードが間違っている。 ・呼び出しは正しいが、使用しているフォントが、ハートのグリフを持っておらず、半角中点で代用されている。 のいずれかです。その点を考慮して、もう一度処理内容を見直してみてください。 > 例) C:\Documents and Settings\userName\デスクトップ\プログラム.exe・・・・・・・・・・・ この文字列は、サンプル掲示板(No.340)のコードで得たものでしょうか。 だとすれば、あのサンプルでは、変数 strFile を、API との通信に用いるための 「最大で512文字分のパスを受け取るためのメモリ領域」として利用しています。 この変数には、初期値として、 strFile = String(512, 0) を事前にセットしてあります。 これは、ChrW(&H0) (すなわち vbNullChar)を、512 個並べた文字列という意味ですね。 そして GetOpenFileNameW API に対しては、こうして確保しておいた文字列型変数のメモリ領域を .lpstrFile = StrPtr(strFile) 'パス文字列を書き込むためのメモリ領域 .nMaxFile = Len(strFile) '上記 .lpstrFile のメモリ領域が確保している文字数 のように指定して渡しています。 そして API 側では、ファイルが選択されたときに、そのフルパス情報を 「.lpstrFile と .nMaxFile で指定された、VB 側のメモリ領域」に書き込むようになっています。 ここに指定した値は、VB 上の変数 strFile (の文字列情報のエリア)のアドレスを 指し示していますので、そこに書き込むことで、変数 strFile の内容も変化することになります。 たとえば、"C:\Dir1\File.txt" が選択されたとしたら、この 512 文字分の領域のうち、 1文字目〜16文字目 → "C:\Dir1\File.txt" (パス情報) 17文字目 → ChrW(&H0) (文字列の終端を表す) 18文字目〜512文字目 → 何もしない(呼び出し前の情報のまま) の文字にそれぞれ書き換わるという仕組みです。 実際のパスは、17文字目の終端文字の直前までですので、先のサンプルでは DlgShowOpen = Split(strFile & vbNullChar, vbNullChar, 2, vbBinaryCompare)(0) というコードで、それを切り出しています。 VB5 の場合は Split 関数がありませんので、かわりに Dim p As Integer p = InStr(1, strFile, vbNullChar, vbBinaryCompare) '最初に見つかった vbNullChar の位置を取得 If p > 0 Then DlgShowOpen = Left(strFile, p - 1) 'Left 関数で、vbNullChar の直前までの文字列を切り出す Else DlgShowOpen = vbNullString 'vbNullChar が見つからなかった場合・ End If などと書き換えてみてください。 |