[go: up one dir, main page]
More Web Proxy on the site http://driver.im/
  • ベストアンサー

dllを使用しVB側に文字列を返す3

いつもこの教えてgooで回答してくださってる方々にはお世話になってます。 前の質問でVCで作成したdllをvbから呼び出して 文字列を渡して返すということを教えて頂いたのですが その件に関連して質問があります。 eucをsjisに変換する自作の dllを使用しているのですが、問題が発生しました。 それは一部、漢字が正確に変換できないのです。 (ちなみにCから呼び出す分には問題は発生しません。) 例えば「これは全角です。」をeuc→sjisは問題ありません。 問題がでるのはある特定漢字コード、具体的には「野」です。 EUCでの「野」の漢字コードはCCEEかと思いますが open~input文で読みとったところCCFBになってしまいます。 これは何故なのでしょうか? またvbのstring型をbyrefで渡したときどの部分に 文字列長の情報が入ってるのでしょうか?184バイト目以降から 2バイト置きに渡した文字列が入っていましたが それ以前の情報は何が何を表しているのかまったくわかりませんでした。 どうかご教授お願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • taka_tetsu
  • ベストアンサー率65% (1020/1553)
回答No.1

eucのファイルをテキストモードで読み込んでいませんか? テキストモードでは、SJISしか扱えません。 Binaryでオープンし、Byte型配列に読み込む必要があります。 あと、下の方なのですが、MSDNでBSTR型について調べてみてください。

sha-girl
質問者

お礼

byte型でロードすればうまくいきました。 ご指摘ありがとうございました。 ただbstrについてかなり複雑なようで よく理解できませんでした。

その他の回答 (1)

  • haporun
  • ベストアンサー率40% (230/562)
回答No.2

VBの文字列をByRefで渡したときは、長さの情報から渡されるわけではありません。 文字列の領域のアドレスを示す変数のアドレスを渡しているのです。 つまりLPSTR* = char**を渡していることになります。 じっさいには、VBではUNICODEが使われているので、関数を呼び出す前にVBがかってに変換し、一時的なバッファのを確保し、そのアドレスを格納した変数のアドレスが渡されることになります。 EUCのほうについては、ちょっとわかりません。

sha-girl
質問者

お礼

レスありがとうございます。大変参考になります。 byrefで渡した値をよみとっていっても 文字列は返ってこないのですね。 184バイト目に文字列がみつかったのは単なる偶然のようでした。 もう少し勉強してみます。

関連するQ&A