すいません。初めて質問させていただきます。
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文字以上の場合)
'以下省略
=====================================================================
StringBuilder の領域を渡しているのであれば、
普通に strcpy で良いのでは?
BSTR型を返却するときは、SysAllocStringByteLenやらSysAllocStringやらを
使わないといけなそうですけど。
補足
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
間違えました。
> int __stdcall FunctionA(LPTSTR user_info)
int __stdcall FunctionA(LPSTR user_info)
Blueさん
素早いレスをありがとうございます。ご指摘のように変更した結果できましたー。
なるほどー。領域を確保している場合は、Byval渡しのChar*受けでいいんですね。
ほんとありがとうございました。
ツイート | ![]() |