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

結論を言いますと、早速色々試したところ、データが受信できるSJISの文字と出来ない文字に分かれました。

>そのドライバの仕様が書かれていないので、推測でしか答えようがないのですが、たとえば
>それが Declare して使う API であり、引数がいわゆる LPTSTR であるならば、VB 側では
>ByVal String を使うのではなく、ByRef Byte を使うようにしてください。

はい、Declareで宣言して使用するAPIです。
で、仰る通りByVal Stringになっていたので、ByRef a() as Byteとしてみましたが、型か違うと怒られてしまいました…

>入れるだけなら、Byte() から変換するのではなく、
> s = ChrW(&H201A)
>あるいは、
> s = ChrW(32 * &H100 + 26)
>で十分かと。

ご教授ありがとうございます。
こういう設定もあったのですね、奥深いですね…

>それは具体的には、どのようにして Byte 変換されたのでしょうか?

以下で試しました。
---
Dim a() as Byte
Dim i as Integer
Dim str as String

str = <何か文字列(今回の送信用データの内容を実際には入れました)>
a = str

For i = 0 to Ubound(a)
    Debug.Print a(i)
Next
---

上記で、イミディエイトウィンドウで値を表示させて見ました。


で、問題の機器なのですが…
IDをファームで設定出来るようで、変更して試してみました。
#IDを変更するとその機器の電源入れなおしが必要ですが…
IDの値は1~255(実際には制御文字等もあるので、32からでしょうね)が設定可能です。

そこで、機器のIDを色々変更してみてテストしてみました。

結果、日本語版でも、Asc(Chr(<数値>))の結果の値が<数値>と同値の場合は正しいデータが取得できました。

しかし、SJISコードにも文字等が設定されてない箇所(全部ではありませんが)では、Asc(Chr(<数値>))の結果は0となり、正しいデータは取得できません。

しかも、0じゃなく正しいデータが取得できる数値は、引数として渡す文字列にChr(<数値>)としてByte列でみてみると、<数値>の値が入っているのです。

しかし、0となる<数値>に関しては、ここで質問したとおり、(26,32)を無理やり突っ込みましたが、正しい値は得られませんでしたし、Chr(<数値>)としてUnicodeで見ると、(26,32)のように、IDの値が推測できそうにない値になってしまいます。
例えば、Chr(130)の結果は63となります。
ここで、どういう法則で結果が<数値>になったり、0の場合はよくわからない値が文字列に設定されるのかがわかりません。
ぐぐりましたが、文字コード等との対応表となるようなものは見つかりませんでした…
#検索のキーワードが悪かったのかもしれませんが…
どういう法則でAsc(Chr(<数値>))で<数値>がでるのか、よくわからない数値が出るのかが不明です…
#ロケールIDの違いかとも思い、SetLocaleInfoとかでかわそうかと思ったのですが、それもうまくいきませんでした…
なぜ<数値>によってAsc(Chr(<数値>))の結果が違うのか原因不明なので、調査しないといけません…
#特殊文字等が入っているのであれば、仕方ないですが、SJISの文字コード表を見ると、制御文字等ではなくても0が返ってきます。
どういう法則でそのような変換がかかるのか、調査をしないといけません。

ともあれ、ありがとうございました、大変助かりました!!!