C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[4]: VBからVC++で作成したdllを参照する方法について


(過去ログ 78 を表示中)

[トピック内 6 記事 (1 - 6 表示)]  << 0 >>

■46313 / inTopicNo.1)  VBからVC++で作成したdllを参照する方法について
  
□投稿者/ モエミ (1回)-(2010/01/29(Fri) 21:03:53)

分類:[C/C++] 

今、VB2008でアプリケーションを作成しているのですが、これをインストールするためのセットアッププロジェクトでシリアルNoを入力させたいと考えています。
色々と調べた結果、入力されたシリアルNoを独自のロジックで評価する場合、評価ロジックはVC++でdllを作成しなくてはならないようで、VC++について色々と勉強をしようとしているところです。
今回作成するVC++(2008)のdllでは、この評価ロジックをVB側でも使用できるようにしたいと思い、テスト的にVC++のintの値を返すものをVB側で参照することができることが分かりました。

// ---VC++側---
// 単に3という値を返すだけ。
// VCTest.dllを作成する。
int Test()
{
    return(3);
}

' ---VB側---
<System.Runtime.InteropServices.DllImport("VCTest")> _
Private Shared Function Test() As Int32
End Function

'FormにボタンButton1を配置する。
'Button1をクリックするとVC++が返す3という値をMsgBoxに表示する。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    MsgBox(Test())
End Sub

ここで質問ですが、VB側でString(あるいはそれに相当する文字列やバイト配列でもいいです)を返してほしい場合、VC++側の関数はどのように定義すれば(つまり、どのような型を返すようにすれば)よいのでしょうか?
例えば、VB側で参照する部分は
<System.Runtime.InteropServices.DllImport("VCTest")> _
Private Shared Function Test() As String
End Function

というものを期待するのですが、その時VC++側のTest()という関数はどのように定義すればいいのでしょうか?
C言語はあまりよく理解しておらず、特にchar*などポインタの知識もあまりありません。
どうぞ宜しくお願いします。

引用返信 編集キー/
■46324 / inTopicNo.2)  Re[1]: VBからVC++で作成したdllを参照する方法について
□投稿者/ επιστημη (2424回)-(2010/01/29(Fri) 23:23:08)
επιστημη さんの Web サイト
C++/CLIではダメですか? めちゃめちゃ楽なんですけど。

引用返信 編集キー/
■46326 / inTopicNo.3)  Re[1]: VBからVC++で作成したdllを参照する方法について
□投稿者/ Jitta (630回)-(2010/01/29(Fri) 23:34:07)
Jitta さんの Web サイト
No46313 (モエミ さん) に返信
> 今、VB2008でアプリケーションを作成しているのですが、これをインストールするためのセットアッププロジェクトでシリアルNoを入力させたいと考えています。
> 色々と調べた結果、入力されたシリアルNoを独自のロジックで評価する場合、評価ロジックはVC++でdllを作成しなくてはならないようで、VC++について色々と勉強をしようとしているところです。
>
> ここで質問ですが、VB側でString(あるいはそれに相当する文字列やバイト配列でもいいです)を返してほしい場合、VC++側の関数はどのように定義すれば(つまり、どのような型を返すようにすれば)よいのでしょうか?
> というものを期待するのですが、その時VC++側のTest()という関数はどのように定義すればいいのでしょうか?
> C言語はあまりよく理解しておらず、特にchar*などポインタの知識もあまりありません。

 ならば、まず、C++言語について調べるのが先だと思いますが?

 適当にメモリを確保して、返せばいいです。ただ、そのメモリを解放しなければならないので、呼び出し側が「何バイト以内に納めてね」とお願いするような作りの方がいいかもしれません。Win32API の多くは、「ここに入れて」と、容器を指定しなければ「何バイト用意しやがれ」と返してきます。VB 側は、StringBuilder を使います。
引用返信 編集キー/
■46337 / inTopicNo.4)  Re[2]: VBからVC++で作成したdllを参照する方法について
□投稿者/ モエミ (2回)-(2010/01/30(Sat) 10:52:29)
みなさん、ありがとうございます。
あれから色々と調べて、またJittaさんの書き込みを参考に、以下のようにしてうまくいきました。

// ---VC++側---
// 引数に"ABCDEF"という値をセットするだけ。
// VCTest.dllを作成する。
void Test(char *str)
{
    strcpy(str,"ABCDEF");
}

' ---VB側---
<System.Runtime.InteropServices.DllImport("VCTest")> _
Private Shared Sub Test(ByVal str As System.Text.StringBuilder)
End Function

'FormにボタンButton1を配置する。
'Button1をクリックするとVC++がセットする"ABCDEF"をMsgBoxに表示する。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim str As New System.Text.StringBuilder
    Test(str)
    MsgBox(str.ToString)
End Sub

これでいいのでしょうか?
指摘やアドバイスがございましたら宜しくお願いします。
ちなみに、VC++に渡す文字は半角英数字のみを考えています。

引用返信 編集キー/
■46372 / inTopicNo.5)  Re[3]: VBからVC++で作成したdllを参照する方法について
□投稿者/ kaishu (5回)-(2010/01/31(Sun) 23:18:41)
No46337 (モエミ さん) に返信

> これでいいのでしょうか?
> 指摘やアドバイスがございましたら宜しくお願いします。
> ちなみに、VC++に渡す文字は半角英数字のみを考えています。

VC++側のアプリの仕様が決まっていればそれに合わせればよいと
 思いますが、文字列を返す仕様であれば、以下でもいいのでは?

 (Imports System.Text)

' ---VB側---
<System.Runtime.InteropServices.DllImport("VCTest")> _
Private Shared Function Test(ByVal str As System.Text.StringBuilder) As System.Text.StringBuilder
End Function

'FormにボタンButton1を配置する。
'Button1をクリックするとVC++がセットする"ABCDEF"をMsgBoxに表示する。
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim str As New System.Text.StringBuilder
:
:
MsgBox(Test(str).ToString())
End Sub


引用返信 編集キー/
■46405 / inTopicNo.6)  Re[4]: VBからVC++で作成したdllを参照する方法について
□投稿者/ モエミ (3回)-(2010/02/02(Tue) 06:23:44)
No46372 (kaishu さん) に返信
なるほど、戻り値をSystem.Text.StringBuilderで受け取るのですね。
kaishuさん、ありがとうございました。
このスレッドはクローズします。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -