VB6で作られたプログラムをExcelVBAに移植しようとしているのですが、外部APIを呼び出す際に文字列を設定するところでVB6では文字列の終端の意味の"Chr(0)"を付け足して実現しているのですが(C言語で作られたものなのでこういう仕様だというメーカーの説明)ここをExcelVBAで実現することが出来ません。文字列だけ渡したり、Chr$(0)やvbNullやvbNullCharやvbNullStringを試してみたのですが文字列の終わりを認識できていないようです。
賢者の方、お知恵をお貸しくださいませ!
StrConv関数をかましてみてはどうでしょう?
http://www.ne.jp/asahi/hishidama/home/tech/excel/dll.html
Cだと文字列は'0x00'≒NULLが番兵となって文字列終了の目印にしています。『C言語で作られたものなのでこういう仕様』というのはそう言う意味です。
で、VBの”string”オブジェクトはUniCodeになっていて、(UniCodeで書かれたファイルなどダンプすると分かりますが)一般文字だと1文字づつ'0x00'が入って1文字しか表示されなかったり、文字化けしてしまうのかと思います。
で、上記ページのMessageBoxの例では、サブルーチンを自作してますが、StrConv 関数を使用して、UniCodeのstringオブジェクトを旧来の文字コードに変換すれば良いかと思います。
Dim ret As Integer ret = MessageBoxPtr(0, VarPtr(text(0)), VarPtr(caption(0)), vbOKOnly) 'ret = MessageBoxPtr(0, StrPtr("message"), StrPtr("title"), vbOKOnly)
としてありますが、コメントアウトしてある場所を書き換えてそのまま(2バイト文字も)使えます。
Dim ret As Integer ret = MessageBoxPtr(0, StrPtr(StrConv("message", vbFromUnicode)), StrPtr(StrConv("title", vbFromUnicode)), vbOKOnly)
ありがとうございます。
早速明日試してみます!