HSPポータル
サイトマップ お問い合わせ


HSPTV!掲示板


未解決 解決 停止 削除要請

2017
0428
玄冬依存文字を含むフォルダにアクセスしたい。3解決


玄冬

リンク

2017/4/28(Fri) 22:20:33|NO.79348

久しぶりに投稿させていただきます。

依存文字(具体的には㎠、平方センチメートルcm^2を1文字で表した記号)が
使われているフォルダに対して


newcom app,"Shell.Application" comres com_res screen 0, 640,480 button "TEST", *test stop *test app->"BrowseForFolder" hwnd,"",$201 if varuse(com_res) { com_res->"Items" com_res->"Item" chdir com_res("Path") } stop
を実行するとエラーが出てアクセスできません。

アクセスするためにはどうしたらよいでしょうか?

http://hsp.tv/play/pforum.php?mode=pastwch&num=50060
は参照しましたがPathFileExistsを用いてこの問題を解決する方法は思いつきませんでした。



この記事に返信する


MillkeySoftw

リンク

2017/4/28(Fri) 22:39:10|NO.79352

Unicode 版HSP を使っていない前提の質問であれば、通常の chdir では無理です。
通常の chdir では、文字コードが Shift-JIS なので特殊文字を認識(解釈)できません。

#uselib "kernel32.dll" #func chdirA "SetCurrentDirectoryA" sptr //Shift-JIS #func chdirW "SetCurrentDirectoryW" sptr //Unicode
なので、取得した文字列を Shift-JIS から Unicode に変換した後に、カレントディレクトリを変更してください。
Shift-JIS から Unicode の変換は、cnvstow 命令で可能です。またその逆は、cnvwtos() で可能です。



玄冬

リンク

2017/4/29(Sat) 00:11:03|NO.79355

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

さっそく
#uselib "kernel32.dll"
#func chdirA "SetCurrentDirectoryA" sptr //Shift-JIS #func chdirW "SetCurrentDirectoryW" sptr //Unicode sdim v_DIR, 500 sdim v_DIR2, 500 newcom app,"Shell.Application" comres com_res screen 0, 640,480 button "TEST", *test stop *test app->"BrowseForFolder" hwnd,"",$201 if varuse(com_res) { com_res->"Items" com_res->"Item" v_DIR = com_res("Path") cnvstow v_DIR2, v_DIR chdirW v_DIR2 dialog dir_cur } stop
としてみましたが、エラーにはならないもののカレントの移動には失敗します。
どうやら、cnvstowは半角文字が混ざると正しく機能しないようですね…

別の変換モジュールを探してみようと思います。解決はしていませんが、
方向性は見えてきたのでいったん解決済みとさせていただきます。



eol

リンク

2017/4/29(Sat) 07:46:46|NO.79356

>どうやら、cnvstowは半角文字が混ざると正しく機能しないようですね…
そうではなく
v_DIR = com_res("Path")
の時点でパス名はシフトJISに変換されるます。
そのときパス名に含まれる文字にシフトJISにない文字があると当然変換できないので、その文字は"?"に変換されます。
一度"?"に変換されたらそのあとユニコードに変換しても元には戻せません。
基本的に解決法はユニコード版HSPを使うのがまっとうな方法だと思います。
ただ、まだまだ不安定な感じなので通序版でも以下でできます。

#uselib "kernel32.dll" #func chdirA "SetCurrentDirectoryA" sptr //Shift-JIS #func chdirW "SetCurrentDirectoryW" sptr //Unicode sdim v_DIR, 500 sdim v_DIR2, 500 newcom app,"Shell.Application" comres com_res screen 0, 640,480 button "TEST", *test stop *test app->"BrowseForFolder" hwnd,"",$201 if varuse(com_res) { com_res->"Items" com_res->"Item" v_DIR = com_res(".Path") chdirW v_DIR("bstrptr") dialog dir_cur } stop



ONION software Copyright 1997-2023(c) All rights reserved.