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で質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# Windows Formアプリからコンソールを呼び出して文字を出力させたい 8 2023/05/09 10:53
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る EXEの実行内容の結果によって、戻り値を0か1かで返したい 1 2023/07/04 16:40
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) ①ExcelVBAでカレンダーを作り、別のユザーフォームで日付を入力したいのですがエラーになります。 1 2023/02/17 18:39
- Visual Basic(VBA) EXCEL VBAにて動的にCheckBOXを複数作成し、同BOXにイベントを追加したい 1 2023/03/16 07:05
- Visual Basic(VBA) VBAでfunctionを利用しようとしたときに「引数は省略できません」というエラーが出ます 1 2022/10/15 16:30
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたい 6 2023/01/23 12:00
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
このQ&Aを見た人はこんなQ&Aも見ています
-
プロが教える店舗&オフィスのセキュリティ対策術
中・小規模の店舗やオフィスのセキュリティセキュリティ対策について、プロにどう対策すべきか 何を注意すべきかを教えていただきました!
-
Cで作成したDLL関数をVBから呼び 引数渡し方法
Visual Basic(VBA)
-
VB.NET DLL【API関数(コールバック関数)】の呼び出し方法について
Visual Basic(VBA)
-
VB.NET デリゲートへのコールバック関数の設定
Visual Basic(VBA)
-
-
4
コールバック関数
Visual Basic(VBA)
-
5
構造体配列を引数とするDLL作成し、VBで呼ぶには?
Visual Basic(VBA)
-
6
ポインタについて
Visual Basic(VBA)
-
7
VB.NETからC++のdll連携(double)
C言語・C++・C#
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0(SP6)にて開発を行なって...
-
指定された引数が有効範囲にな...
-
res://ieframe.dll/について
-
Excel2007のVBAで、セル範囲を...
-
VB6 - DLLの動的リンクの方法に...
-
visual studioの不要なDll削除方法
-
ファイルをvbaで圧縮したいので...
-
ASP.NETのDLL入れ替えについて
-
C# ネット上に公開されているFF...
-
M365にアップデートしてからコ...
-
shell32.dll のアイコンを使っ...
-
about:blankの削除したいのです...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
<math.h>があるのにsqrtが・...
-
<unistd.h>をVisualStudioでつ...
-
C言語をコンパイルするとコンピ...
-
unsigned long long 型のフォー...
-
VBAを何回も作り直して、容量が...
-
適切な変換関数が存在しない???
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
M365にアップデートしてからコ...
-
C# DLL エントリ ポイントが...
-
visual studioの不要なDll削除方法
-
res://ieframe.dll/について
-
ASP.NETのDLL入れ替えについて
-
C++製DLLにてVB.NET関数を引数...
-
VB6.0(SP6)にて開発を行なって...
-
ファイルをvbaで圧縮したいので...
-
WIN10で常にフォームを手前に
-
VB.NET xdoc2txtをつかってPDF...
-
VC++6.0 でのライブラリ参照方法
-
VB2003で レジストリを格納する
-
user32.dllがないためアプリが...
-
エクセル マクロで指定フォルダ...
-
vb6で作成した画面が処理に時間...
-
VBAエディタのコード画面で、カ...
-
[VBA]64b版-行数表示.dllの登録...
-
指定された引数が有効範囲にな...
-
Java hs_err_pid0000.log解析
-
メイクファイルからdllを生成す...
おすすめ情報