
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()を呼びたいが、記述の方法が分かりません。
ご教示お願い致します。
No.1ベストアンサー
- 回答日時:
引数は具体的にどのような型になりますか?
WinAPIでも引数付コールバック関数を呼ぶものもありますので参考にしてみてはどうでしょうか?(VB側は)
EnumWindows みたいなの。
[MSDN]http://msdn.microsoft.com/ja-jp/library/843s5s5x …
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) {
ありがとうございます。
C++側の宣言をご教示のとおり、
DLL_API void dllfunc(int (CALLBACK *vbfunc)(int))
とし、VB.NET側でデリゲートしている箇所、func1の引数を指定してやると
上手く動作する事が出来ました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
指定された引数が有効範囲にな...
-
visual studioの不要なDll削除方法
-
VBAエディタのコード画面で、カ...
-
VB6.0(SP6)にて開発を行なって...
-
VB6 - DLLの動的リンクの方法に...
-
user32.dllがないためアプリが...
-
C# DLL エントリ ポイントが...
-
VB.NET xdoc2txtをつかってPDF...
-
ファイルをvbaで圧縮したいので...
-
vb6で作成した画面が処理に時間...
-
エクセル マクロで指定フォルダ...
-
res://ieframe.dll/について
-
ウインドウズxpの「ファイルを...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<unistd.h>をVisualStudioでつ...
-
” OS ビルド ” の意味が分か...
-
C言語でヘッダファイルにグロー...
-
デバッグ中のエラーのことで教...
-
VBAを何回も作り直して、容量が...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VB6.0(SP6)にて開発を行なって...
-
ASP.NETのDLL入れ替えについて
-
user32.dllがないためアプリが...
-
visual studioの不要なDll削除方法
-
res://ieframe.dll/について
-
C# DLL エントリ ポイントが...
-
C++のdllの作り方を教えてく...
-
VC++6.0 でのライブラリ参照方法
-
ファイルをvbaで圧縮したいので...
-
vb6で作成した画面が処理に時間...
-
指定された引数が有効範囲にな...
-
VBAエディタのコード画面で、カ...
-
ptipi.dll に関し未解決問題
-
[マインクラフト] Javaが64bit...
-
VB.NET xdoc2txtをつかってPDF...
-
M365にアップデートしてからコ...
-
プロシージャエントリポイント ...
-
WIN10で常にフォームを手前に
-
エクセル マクロで指定フォルダ...
-
メイクファイルからdllを生成す...
おすすめ情報