VB6で海外向けのソフトを開発しています。
英語版OSでも日本語OSでも動くのですがヨーロッパでは動かないとの連絡があったためロケールをアメリカにしてもらったら動くようになったとのことでした。OCX(CMNDLG32など)は意識して使っていません。毎回このような設定変更なしに動くようにするにはどうしたら良いか教えてください。
SetLocaleInfo で指定可能ですが、まずは、なぜそのロケールだと
動かなかったのか、その原因を特定した方が良いような気がします。
迅速な回答をありがとうございました。 最悪の場合はSetLocaleInfoで強制的に変更させることで解決できそうなことを担保に本来の根本原因を追究してみたいと思います。
使用者(イタリア)からの情報ではファイルリストボックスでファイルを選択する段階でファイル名が正しく指定できていないようでFile Not Foundエラーとなるようでした。(コモンダイアログなどは使っていません)ロケールの変更をしてもらったらOKでしたのでロケールの変更をまず考えてしまったのですがこの根本原因がわかりません。他の結構複雑なグラフィックスなどは問題なく動くようでとりあえずはリストボックス、ファイル名のあたりが問題とにらんでいますがわかりません。
VB6は日本語で日本語OSで開発して完全英語環境のマシンでテストして出したものです。アメリカのソフトは日本でも動くので英語マシンで問題なければ万国OKと思っていました。 どのあたりに注目したら良いかのヒントをいただけたら有難いです。 よろしくお願いします。
英語環境では、基本ランタイムだけで動きますが、他言語では、
各言語向けのサテライトDLLが必要になります。
たとえば日本語環境で、VB6JP.DLL が必要なように、
イタリアでは VB6IT.DLL が必要とされます。
> ファイル名のあたりが問題とにらんでいますがわかりません。
ファイル名に関しては、使われている文字次第ですね。
VB6は、(VB.NET と違って)Unicode パスをサポートしていないため、
たとえば日本語環境でも、パスにハートマーク(ChrW(&H2665))や
日本に無い漢字などといった「Shift_JIS に無い文字」が含まれて
いた場合、VB6標準のファイル操作は失敗します。
魔界の仮面弁士さん早速ありがとうございます。ユニコードに関する過去ログを見た見ましたがご指摘のようにVB6でスッキリと完全解決したものは見つかりませんでした。
VB6IT.DLLなど各国のサテライトDLLを準備することは無理ですので ①イタリアロケールで動くようにファイル名を工夫してみる ②一時的にアメリカロケールに強制的に変更して終了時に戻す、などの方法を試してみたいと思います。
追加の質問ですがVB.NETではこのような問題はスッキリと解決できるのでしょうか?
GetLocaleInfo,SetLocaleInfo、GetUserDefaultLCIDなどを僅かながら勉強して試しましたがコントロールパネルによるロケール変更のようにはできないことがわかりました。暫定手段としてGetUserDefaultLCIDでロケールがアメリカでない場合はアメリカロケールに変更してくれ、というメッセージを出すことで対応することとして今回の質問は一旦解決チェックをつけさせていただきます。魔界の覆面弁士さん、回答を感謝します。 良い勉強になりました。
| ツイート |
|