- 締切済み
VCでのDLLからVBへの文字列の引渡し
===VB(Ver.6.0 SP5)側=== Public Declare Function GetStrSample Lib "Test.dll" () As String ・・・・・ Label1.Caption = GetStrSample ===VC側(Ver6.0)=== const char *StrSample="ABCDE01234"; ・・・・ _declspec(dllexport) BSTR _stdcall GetStrSample() { CString strResult; strResult = StrSample; return strResult.AllocSysString(); } 上記のようなコードで、VC側をDLLとしてVBから呼び出すと、 Label1には "A" しか表示されず、ブレークを置いてGetStrSample の戻り値を調べてみると、0x41,0x00,0x42,0x00,のように、 0x00が挟まれてしまいました。 ( ?hex(asc(mid(GetStrSample,3,1))) のようにして調べました。) 何故なのでしょうか? 文字コードの違いでしょうか? 正常にABCDE01234が渡せるようにするにはどうすればいいでしょうか? VCは初心者で、本や他人の作ったコードやMSDNを見て作成してみました。 目的は、DLLのバージョン等の情報をVB側に渡したいのです。 よろしくお願いします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- chibita_papa
- ベストアンサー率60% (127/209)
VCは分かりませんが、 unicodeのテキストをバイナリエディタでみると 0x00が挟ませています。 それで参考にしてください。 Private Sub Form_Load() Dim buf As String buf = Chr(&H41) & Chr(&H0) & Chr(&H42) & Chr(&H0) & Chr(&H43) & Chr(&H0) Text1 = buf Text2 = StrConv(buf, vbFromUnicode) End Sub
お礼
早速回答ありがとうございました。 ご回答を参考にして、 StrConv関数をかませてみたら、正常に表示されるようになりました。 Label1.Caption = StrConv(GetStrSample, vbFromUnicode) やはり、コードの問題のようですね。 対症療法的には、これで充分実用になります。 ありがとうございます。 ただ、不思議なのは、VC側のこの部分、 _declspec(dllexport) BSTR _stdcall GetStrSample() { CString strResult; strResult = StrSample; return strResult.AllocSysString(); } これは、あるところで使われている関数を殆どそのまま持ってきたのですが、 そこでは、上記のような変換関数は必要なく、正常に表示されるのです。 それは、DLLではなくてOCXなのですが、何か違うのでしょうか? (VCのカテゴリーで質問しようか迷いましたが、同種の質問がVBにたくさんありましたので、こちらにしました。) 誰かご存知の方、おりませんでしょうか?