※ ChatGPTを利用し、要約された質問です(原文:C++製DLLにてVB.NET関数を引数付きでコールバックしたい。)
C++製DLLにてVB.NET関数を引数付きでコールバックしたい
このQ&Aのポイント
C++製DLLにてVB.NET関数を引数付きでコールバックする方法について教えてください。
C++製DLLのdllfunc()から引数付きでVB.NETのfunc1()を呼び出す方法を教えてください。
C++製DLLでVB.NET関数をコールバックする場合、引数の扱い方はどのようになりますか?
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 ---
LIBRARY dll
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()を呼びたいが、記述の方法が分かりません。
ご教示お願い致します。
お礼
ありがとうございます。 C++側の宣言をご教示のとおり、 DLL_API void dllfunc(int (CALLBACK *vbfunc)(int)) とし、VB.NET側でデリゲートしている箇所、func1の引数を指定してやると 上手く動作する事が出来ました。