こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C++製DLLにてVB.NET関数を引数付きでコールバックしたい。

C++製DLLにてVB.NET関数を引数付きでコールバックしたい。

以下のようなソリューションがあります。
ソリューションには、VB.NETによるプロジェクトapp、C++によるプロジェクトdllがあり、
名前のとおり、appはWindowsフォームアプリケーション、dllはクラスライブラリです。

*** VisualStudio.NET 2003 ソリューション ***

=== VB.NETプロジェクト:app.exe ===

--- Module1.vb ---
Module Module1
Delegate Function _t() As Int32
<System.Runtime.InteropServices.DllImport("dll.dll")> Public Function dllfunc(ByVal lpFunc As _t) As Int32
End Function
End Module

--- Form1.vb ---
Public Class Form1
Inherits Form
Private button1 As Button
Public Sub New()
button1 = New Button
button1.Parent = Me : button1.Text = "button1"
AddHandler button1.Click, AddressOf MyClass.GetEvent
End Sub
Private Sub GetEvent(ByVal sender As Object, ByVal e As EventArgs)
dllfunc(AddressOf func1)
End Sub
Public Function func1() As Int32
MsgBox("func1@vb.net")
Return 123
End Function
End Class

=== C++ライブラリプロジェクト:dll.dll ===

--- dll.def ---
LIBRARYdll
EXPORTS
dllfunc

--- dll.h ---
#ifdef DLL_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
DLL_API void dllfunc(int* vbfunc(void));

-- dll.cpp ---
#include "stdafx.h"
#include "dll.h"
#include "stdio.h"
#include "windows.h"
BOOL APIENTRY DllMain( HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
{
return true;
}
DLL_API void dllfunc(int* vbfunc(void))
{
char str[16];
sprintf(str,"vbfunc() = %d",vbfunc());
MessageBoxA(NULL,str,"dll",MB_OK);
}

--- stdafx.cpp, stdafx.h ---
(省略)

*** ソリューション ここまで ***

[ 動作 ]
appを実行すると、Form1にbutton1が生成される。
button1をクリックするとGetEventが呼ばれ、func1のアドレスを引数としたdllfunc()を呼びます。
dll側のdllfunc()から、app側のfunc1()を呼び、戻り値の123を表示します。

[ 質問 ]
dllfunc()から引数付きでfunc1()を呼びたいが、記述の方法が分かりません。
ご教示お願い致します。

投稿日時 - 2010-08-23 11:49:30

QNo.6129293

困ってます

質問者が選んだベストアンサー

引数は具体的にどのような型になりますか?

WinAPIでも引数付コールバック関数を呼ぶものもありますので参考にしてみてはどうでしょうか?(VB側は)

EnumWindows みたいなの。
[MSDN]http://msdn.microsoft.com/ja-jp/library/843s5s5x.aspx

C++側のDLLの実装は
>DLL_API void dllfunc(int* vbfunc(void))
vbfuncがintの引数をとりintの値を返すのであれば
DLL_API void dllfunc(int (CALLBACK *vbfunc)(int))
でしょうか。
typedef するなら
typedef int (CALLBACK* VBFUNC)(int);
DLL_API void dllfunc(VBFUNC vbfunc) {

投稿日時 - 2010-08-23 14:04:24

お礼

ありがとうございます。

C++側の宣言をご教示のとおり、
DLL_API void dllfunc(int (CALLBACK *vbfunc)(int))
とし、VB.NET側でデリゲートしている箇所、func1の引数を指定してやると
上手く動作する事が出来ました。

投稿日時 - 2010-08-23 17:08:31

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問