C++DLLから.netにコールバック

[戻る]
アレカ 2010/10/01(金) 00:24:51
お世話になります。
xp3、VB.netとVC6.0でプログラムを組んでいます。

exe(VB.net#で作成)からdll(VC++で作成)に対してC/C++でいうところの関数ポインタ(C#の
メソッド)を登録して、dllから任意のタイミングでコールバックしたいです。

以下で実装されているみたいなことがしたいのです。

EnumWindows関数のコールバック関数を登録する。
http://msdn.microsoft.com/ja-jp/library/843s5s5x.aspx

VB.netからの呼び方はわかりますが、肝心のdll内でどのような処理にすればよいかわかり
ません。
exeがVB6ではAddressOfを使用して実装していました。
(dllの引数はlong*で、中で関数ポインタにキャストしてコールできていました。)

何か情報をお持ちの方いらっしゃいませんでしょうか?

#.netからC++を使うのは簡単だが逆は非常に複雑怪奇だということを小耳にはさんだこと
がありますが、本当なのでしょうか・・・

Kelly 2010/10/01(金) 10:39:42
呼び出し側が.NETであるかどうかに関わりなく、
以下に通りにすれば良いかと思います。

□ CPPファイル

typedef void (CALLBACK *CALLBACKPROC)(int);

static CALLBACKPROC callbackProc;

// コールバック関数の登録
extern "C"
void WINAPI RegisterCallback(CALLBACKPROC proc)
{
    callbackProc = proc;
}

// コールバック関数の登録解除
extern "C"
void WINAPI UnregisterCallback()
{
    callbackProc = NULL;
}

// 任意のタイミングで
void Func()
{
    if (callbackProc != NULL)
        callbackProc(100);
}


□ DEFファイル

EXPORTS
    ; 明示的なエクスポートはここへ記述できます
    RegisterCallback
    UnregisterCallback

επιστημη [E-Mail] [HomePage] 2010/10/01(金) 19:40:01
VC6でさえなければC++/CLIで書けるんですけどねぇ...

ゼロム 2010/10/03(日) 10:46:24
いまだにVC6を使っているプログラマーがいることに驚きます。

自分は極貧プログラマーですが、コンパイラくらいは新しいものを買ってます。
プログラマーにとっては必需品ですからね。

ていうか、ソフトを作る側がこんなことでは、ユーザーに対して有償アップを
してくださいなんて言えないですよね。

ソフトは売れないし、どんどんフリー化していくし、
もう、ソフトハウスなんて成立しない時代なのかもしれませんね。
ソフトはGoogleみたいな会社が、余ったお金で作るもの・・・悲しいです。

マイクロソフトが無料のセキュリティソフトを出してしまったおかげで、
ノートンやカスペルスキーも消えるでしょうね。

本題とは関係ない話ですみません。m(_ _)m

επιστημη [E-Mail] [HomePage] 2010/10/03(日) 19:08:52
> いまだにVC6を使っているプログラマーがいることに驚きます。

おしごとだとしゃぁないこともありますけどね。
お客さんに納めたやつが旧くって、そいつのメンテのためには捨てられんとか。

そうでもなきゃ旧いの使い続ける意味ねぇですが。

PATIO 2010/10/04(月) 09:45:30
επιστημηさんが言われている通りで
仕事上の必然があれば仕方ないかもとも思います。
開発環境の移行でお客さんにもバージョンアップを
お願いするのが難しいというケースも多々聞くので
開発側だけの都合で開発環境を移行できないのも
また事実でしょう。
出来れば、計画的にアナウンスしつつ、
新機能の追加もするから移行も同時にしましょうとか、
ライブラリ等のバージョンアップの必要性を
お客さんに納得してもらって移行できると良いのですけれど。

お客さん相手の話だとこの辺つらいですよねぇ。

古いスレッドには追加発言できません。