投稿者 やんやん  (その他) 投稿日時 2009/1/22 11:12:22
魔界の仮面弁士様、フォロー頂きありがとうございます!!!

>その事情をお聞かせ願えませんか?
>画面表示が目的なのか、通信電文やファイル出力などに使うのが
>目的なのかによって、行うべき対処方法も変わってきてしまいますので。

そうなんですか、用途によって対処法が変わるのですね…
実は、USBで接続したある機器を操作するために必要な処理で使うのです。
「データ頂戴」と機器に送信し、送信した内容が正しければ機器から正しいデータが返ってくるというものです。
機器はアメリカ製でDLLのドライバの製作者もアメリカ人のようです。

で、130とか131とかいうのは、その機器のIDでして、「データ頂戴」というときに、Chr(130)や他の制御文字等を一緒に送信して、送信内容が正しければ正しいデータが機器から返ってきます。
「文字」と書いてしまったのでまずかったと思いますが、要は英語版のChr(130)と同じ値のUnicodeの文字列の2バイトの値2バイト分ともが欲しかったのです。
#日本語版だと0になってしまって、送っても正しいデータが返ってこないので

結論から言うと、変換は出来ましたが、正しいデータは取得できませんでした。

ある方から、「そういう場合はnバイト丸ごと送るのではなく、1バイトずつ送ることもあるので、"1" "3" "0"と1バイトずつ送るように文字列を作ってみれば?といわれたので、バイト配列で「1」等数字そのものやAsc("1")等Asc()で変換して送ったりしてみましたが、駄目でした。

ご提示頂いたコードで、
>ReDim b1(0), b2(0)
というのがキモだったのですね、気づきませんでした…
#先のコードには書いてませんでしたが(消してしまってましたが)、ReDim a(1)と2バイト分取っていたので、StrConvで正しく変換できなかったようです…

---
Dim a() as Byte
Dim s as String
ReDim a(0)
a(0) = 130
s = StrConv(a,vbUnicode,1033)
---
としたら、文字列sに(26,32)と入りました!
ありがとうございます!

しかし、英語版を見ても日本語版を見ても、送信しているデータをUnicodeの2バイトの文字を1バイトずつByteにして見てみました。
同じ値が入っているにもかかわらず、日本語版ではデータが取得できませんでした…

>この手の処理を行う際、LocaleID を使用できない文字列関数/ステートメント
>(例えば、CStr/Str/Chr/Mid/Left/Right/MsgBox 等)および ANSI 系 API や
>標準コントロール(TextBox, Label 等) は一切使用不可能と思ってください。

>バイト系関数(LeftB/MidB/RightB 等)や Wide 系 API、それと
>Unicode 対応な ActiveX コントロールなどが限定的に使用可能です。

ご教授ありがとうございます。
ということは、もし機器のIDをドライバが取得するのに、Chr(130)を含む文字列で送られてきたものを、Asc(<Chr(130)のある1文字>)とかして取得してたら、日本語版ではどう転んでも無理ということですね…
英語版ではAsc(Chr(130))は130で返ってくるのですが、日本語版では63が返ってきます。
130でも131でも63です。
#128以上が駄目なので、当たり前といえば当たり前なのですが…
機器のIDのドライバ内での取得の仕方をちょっと確認を取ってみます。
#Asc()でIDを取ってる可能性は否定できませんので。

>また OS の違い、特に 9x系列 と NT系列では異なる結果になりえる事も覚悟して置いてください。

承知致しました。
W2K or Laterのようなので、多分大丈夫だと思います。

>VB6 が使うのは、「既定の ANSI コードページ」です。

>日本語(LCID=1041)
> 既定のANSIコードページ = 932
> 既定のEBCDICコードページ = 20290

>米語(LCID=1033)
> 既定のANSIコードページ = 1252
> 既定のEBCDICコードページ = 37

こちらもご教授ありがとうございます。
「VB6 英語 コードページ」とかでぐぐってみたのですが、キーワードが悪かったのか、上記の内容が検索できませんでした。

ともあれ、ソース的にやりたいことは出来ましたので、謹んで深く感謝致します。
ありがとうございました!!!
#まだまだ精進が足りません、もっと精進せねばと思いました…