tagCANDY CGI VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
VBレスキュー(花ちゃん)の Visual Basic 6.0用 掲示板
[ツリー表示へ]  [ワード検索]  [Home]

タイトル 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

などと書き換えてみてください。

- 関連一覧ツリー をクリックするとツリー全体を一括表示します)

古いスレッドにレスはつけられません。