VC++のDLLからVB.NETへ文字列を渡すには?

解決


K平ら  2006-06-23 01:50:52  No: 62296

すいません。初めて質問させていただきます。

VB.NETから、VC++6.0で作成したDLLを呼び出してファイルに組み込んだヘッダーの文字を戻す処理を行いたいのですが、文字列の引渡しがうまくいきません。
インタフェースは、VB側がStringBuilder、VC側がBSTRで行っていて、引き渡そうとした文字数が、16文字以内であればうまくいくのですが、StringBuilderのDefaultcapacityの16文字以上になると、「System.ArgumentOutOfRangeExceptionのハンドルされていない例外が 発生しました。追加情報 :容量が最大値を超えています。」
というエラーが発生してしまいます。

すいませんが、どなたか心当たりのあるかたよろしくお願いします。
以下ソースです。
=====================================================================
DLL側ソース(該当部分以外省略)
(VC++6.0 SP6  開発OS:Windows2000SP4)

int __stdcall FunctionA(BSTR *user_info)
{
    *user_info =SysAllocStringByteLen("abcdefghijklmnopqrstuvwxyz",26);  //戻す文字列を格納
    return 0;   //成功
}

=====================================================================
VB.NET側ソース(該当部分以外省略)
(VB.NET  開発OS:WindowsXP SP1)

'宣言部分
Public Declare Function FunctionA Lib "AAA.dll" ( _
    ByRef user_info As System.Text.StringBuilder ) As Integer

'呼び出し部分(ボタンクリック)
Dim intRet as integer
Dim strRet As New System.Text.StringBuilder(81, 81) 'キャパシティとマックスキャパシティを最大81文字に設定)

'DLL関数呼び出し
intRet = FunctionA (strRet)  'ここでエラーになって値がもどってこない(16文字以上の場合)    

'以下省略
=====================================================================


Blue  2006-06-23 01:57:33  No: 62297

StringBuilder の領域を渡しているのであれば、
普通に strcpy で良いのでは?

BSTR型を返却するときは、SysAllocStringByteLenやらSysAllocStringやらを
使わないといけなそうですけど。


Blue  2006-06-23 02:06:07  No: 62298

補足

strcpyにする場合

ByRefではなく、ByValでStringBuilderを渡して、
char*型で受けるようにします。(WinAPIをVB.NETで使うときと同じ)

int __stdcall FunctionA(LPTSTR user_info)
{
    strcpy( user_info, "abcdefghijklmnopqrstuvwxyz");  //戻す文字列を格納
    return 0;   //成功
}

Public Declare Function FunctionA Lib "AAA.dll" ( _
    ByVal user_info As System.Text.StringBuilder ) As Integer


Blue  2006-06-23 02:06:52  No: 62299

間違えました。
> int __stdcall FunctionA(LPTSTR user_info)
int __stdcall FunctionA(LPSTR user_info)


K平ら  2006-06-23 02:14:30  No: 62300

Blueさん

素早いレスをありがとうございます。ご指摘のように変更した結果できましたー。
なるほどー。領域を確保している場合は、Byval渡しのChar*受けでいいんですね。
ほんとありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加