- PR -

VC++の関数からVB.NETで文字列を受け取る方法

1
投稿者投稿内容
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-01-06 17:52
ぷーちんです。いつもお世話になっております。

VC++で文字列を取得する関数があるDLLを作成し、
この関数を VB.NET から呼び出そうとしています。
文字列を VC++の関数に渡す場合は以下の方法で可能ですが、

例)VC++の関数 CharPut(const char* cData) 文字列を渡す
CharPut(System.Text.Encoding.Default.GetBytes("abcdefg"))

取得する事がどうしてもできません。
以下にサンプルのソースを載せました。
Byte配列では取得できないのでしょうか?
よろしくお願い致します。

VC++
---------------------------------------------------------------------
// 文字列取得関数
void WINAPI CharGet(char* chrpData)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());

strcpy(chrpData, "ABCDEFG");
}

VB.NET
----------------------------------------------------------------------
'APIの宣言
Private Declare Auto Sub CharGet Lib "CharTest002.dll" _
Alias "CharGet" (ByRef bytData As Byte())

'このメソッドで取得する
Private Sub GetChar()
Dim bytWork(32) As Byte

'ここで呼び出す
CharGet(bytWork)
System.Diagnostics.Debug.WriteLine("Char:" + System.Text.Encoding.Default.GetString(bytWork))
End Sub
二天
ベテラン
会議室デビュー日: 2001/09/26
投稿数: 60
投稿日時: 2003-01-07 00:11
ヘルプの「プラットフォーム呼び出しのデータ型」ページを参照してもらえばわかると思いますが、アンマネージC言語の型がchar*の場合、.NETではSystem.StringまたはSystem.Text.StringBuilderクラスで引数の受け渡しをすることになるはずです。
#ヘルプではStringBuilderがSystemネームスペースにあると誤記載されています。
ぷーちん
常連さん
会議室デビュー日: 2002/10/30
投稿数: 28
投稿日時: 2003-01-07 14:06
ぷーちんです。

二天さん、いつもありがとうございます。

御回答の通り、StringBuilderクラスで受け渡しができました。
パラメータを渡すだけの場合も、Byte配列ではなくStringでできました。

VB.NETのソースを以下のように修正しました。
※宣言の ByRef のところも ByVal に直しました。

VB.NET
----------------------------------------------------------------------
'APIの宣言
Private Declare Auto Sub CharGet Lib "CharTest002.dll" _
Alias "CharGet" (ByVal strbData As StringBuilder)

'このメソッドで取得する
Private Sub GetChar()
Dim strbWork As New StringBuilder(128)

'ここで呼び出す
CharGet(strbWork)
System.Diagnostics.Debug.WriteLine("Char:" + strbWork.ToString)
End Sub

どうもありがとうございました。
今後ともよろしくお願い致します。
1

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