VB.NET DLL 参照型String読込み
VCで作成されたDLLの参照型Stringの読込みに困っております。
ご存じの方、お教え下さい。
VB6では次のような定義で、問題なく実行できます。
Private Declare Function VcToVb _
Lib "xxxxxxx.dll" Alias "VcToVb" _
(ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Long, _
ByRef strData As String, ByRef Err_Cnt As Long, ByRef Err_DATA As String) As Long
------------------------------------
Out_Str , Err_Str の領域を確保
iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR)
これを VB.NETで実施
Private Declare Ansi Function VcToVb _
Lib "xxxxxxx.dll" Alias "VcToVb" _
(ByVal Input_DATA As String, ByVal Input_DATA_Cnt As Int32, _
<MarshalAs(UnmanagedType.LPStr)> ByRef strData As StringBuilder, _
ByRef err_cnt As Int32, ByRef Err_DATA As StringBuilder) As Int32
(テストのため、strDataのみ)
--------------------------------------
Out_Str , Err_Str の領域を確保
iRent = Check_VcToVb1(Input_STR, Input_Cnt, Out_STR, Err_Cnt, Err_STR)
*******************************************
調べた結果、VB.NETでは参照型は簡単にはいかないみたいで、StringBuilderを使用するとか、色々な方法を試しました。
結果は戻ってくるのですが、問題は DLLが文字列を返すときに、文字列内の項目区切文字として
chr(0)を設定します。
このため、結果は Chr(0)の前までしか設定されません。
(VB.NETが Chr(0)を文字列の最後と判断する?)
これを解決する方法はありますでしょうか。
現在は VB6で呼出す DLLを作成し、VB.NETはこれを使用していますが、
C#.Netならできるのでしょうか。
よろしくお願い申し上げます。
お礼
ご説明ありがとうございます。 参照先もたくさん教えて頂き、ありがとうございました。 参考にして色々試してみます。 (仮想メモリのことも) 私も今まではそういうことをしたい場合は、 プロセス間通信でしかやったことがなく、 DLLも単純なものしか作成したことがなかったので、 関数の入り口だけのDLLをポンと渡されて、 試行錯誤しています。 本当に助かりました。