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も見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VB6.0(SP6)にて開発を行なって...
-
手書き文字認識のdll
-
WIN10で常にフォームを手前に
-
C++製DLLにてVB.NET関数を引数...
-
C# DLL エントリ ポイントが...
-
python エラー
-
エクセルのエラーメッセージ「4...
-
コンパイルできません。
-
<unistd.h>をVisualStudioでつ...
-
アプリケーションのDLLファイル...
-
eclipseでプログラムが実行でき...
-
Excelのエラーで困ってます。
-
C言語でヘッダファイルにグロー...
-
ASP.NET exeの作成方法
-
漢字のコメントをはずすとコン...
-
” OS ビルド ” の意味が分か...
-
ビープ音が鳴りません・・・
-
1 つ以上の複数回定義されてい...
-
Excel VBAのCSVファイルマージ...
-
すべてのリビルド: 0 正常、 0 ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
visual studioの不要なDll削除方法
-
C# DLL エントリ ポイントが...
-
VB6.0(SP6)にて開発を行なって...
-
WIN10で常にフォームを手前に
-
VC++6.0 でのライブラリ参照方法
-
エクセル マクロで指定フォルダ...
-
res://ieframe.dll/について
-
VBAエディタのコード画面で、カ...
-
ASP.NETのDLL入れ替えについて
-
指定された引数が有効範囲にな...
-
dllをいじる。。
-
メイクファイルからdllを生成す...
-
手書き文字認識のdll
-
[VBA]64b版-行数表示.dllの登録...
-
VBにてIMEの入力モードを変える...
-
VB2003で レジストリを格納する
-
VB.NET xdoc2txtをつかってPDF...
-
コマンドラインで商用利用可能...
-
wavからmp3に変換する方法
-
ファイルをvbaで圧縮したいので...
おすすめ情報