- PR -

VC++で作ったDLLをVB.NETから呼び出したい(二次元配列)

1
投稿者投稿内容
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2008-04-09 12:41
OS:Windows XP SP2
開発ツール:Visual Studio 2005(C++,VB使用)

VB2005のC++で作成したDLLを、
VB.NETから呼び出したいのですが、
戻り値(正確には引数)が二次元配列になっており
VB.NET側で正しく受け取ることができず悩んでおります。

【VC++側のソース】

Export int __stdcall Read_EmpCode(char **pCodeList) {
〜省略〜
  return 0;
}

デバッグ時、クイックウォッチで、
pCodeListの中を見ると、
正しくコードが格納されていることは確認済です。
pCodeList[0] = "111111"
pCodeList[1] = "222222"

【VB側のソース(呼び出し側)】

Declare Function ReadEmpCode Lib "READ_CODE" Alias "_ReadEmpCode@4" _
(ByVal s As System.Text.StringBuilder) As Integer

Private Sub Button1_Click()

Dim strCode As New System.Text.StringBuilder
Dim intRet As Integer

'DLL関数の呼び出し
intRet = ReadEmpCode(strCode)

End Sub

デバッグ時、クイックウォッチで、
strCodeの中身を見ると、文字化けした文字(記号)が
格納されています。

C++の引数が二次元配列で、その二次元配列の中身を
VB.NET側から受け取るにはどのように記述すればよいか
ご存知の方がおられましたら、教えてください。
よろしくお願い致します。
さくら
ベテラン
会議室デビュー日: 2004/02/12
投稿数: 76
投稿日時: 2008-04-09 12:45
すいません。。。訂正と追記です。

VC側のソース(関数の宣言部)は
Export int __stdcall Read_EmpCode(char **pCodeList) {
ではなく、
Export int __stdcall ReadEmpCode(char **pCodeList) {
の誤りです。

また、VB側のDeclare Functionの宣言で、
Declare Auto Function
Declare Ansi Function
Declare Unicode Function
と3パターンとも試してみましたが、どれも結果は同じで、
strCodeの中身を見ると、文字化けした文字(記号)が
格納されていました。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2008-04-09 14:03
これは一般に文字列の配列って言うと思いますが。

メモリ解放のことも考えれば、ByVal pCodeList As IntPtr() で受け取って
それぞれ Marshal.PtrToStringAnsi するのがいいんではないでしょうか。
1

スキルアップ/キャリアアップ(JOB@IT)