知恵をお貸しください。
MFC VC2003でアプリとDLLを作成しています。
アプリ側で作成したアーカイブファイルの中身をツリー表示させるのに、
DLL側にアーカイブファイルのパスを渡して、DLL側で解凍させようと考えています。
しかし、ツリーコントロールはアプリ側にあるので、どうやってDLL側から
解凍したファイル名を取得しようか迷っています。
CStringArrayをDLL側に渡してファイル名取得後、アプリ側で表示させる、
といったことも考えたのですが、アーカイブファイルは何GBにもなる可能性もあり、
Array系ではパフォーマンスが心配です。
ダイアログデータをDLL側に渡すのも、汎用性があるDLLにしたいため、考えられません。
皆様はどうするのかお聞かせお願いします。
たとえば…
DLL に書庫ファイルを渡したら、DLL 内でファイルリストを保持しておき、アプリにそ
のリストの「ハンドル」を返す。
アプリからは DLL の関数にハンドルを渡すと、リスト内のファイル名を1個ずつ取得で
きるようにする。
ハンドル解放関数を呼ぶと、DLL はファイルリストを開放する。
とか。
FindFirstFile に似ていますね。
ハンドルは、例えばファイルリスト(CArray とか)のポインタでも構いません。
ただし、アプリからはそれはあくまで「ハンドル」であってそれ以外ではないので、ア
プリ側でハンドルを CArray* にキャストしてアクセスしたりしてはいけません。
ハンドルから中身のデータを取り出す作業は全部 DLL にやらせます。DLL だけが、「ハ
ンドルは実は CArray* であること」を知っているわけです。
処理に時間がかかるようであればDLL側にコールバック関数のアドレスを渡して
EXE側で処理する方法もあります。
(例えばCABファイルを解凍するFDICopyというAPIはファイルの展開中に
コールバック関数に通知する)
途中でキャンセルもできますしね。
aetos様、subaru様、有難うございます。
考えた結果、subaru様の方法で、
DLL側にコールバック関数のアドレスを渡して、
DLL側でファイルが見つかる度にコールバック関数を呼び出して
ファイル名をアプリ側に渡す。という方法をとることにします。
そこで、コールバック関数はあまり使ったことがないので教えて頂きたいのですが、
現在、アプリ側ではLIBファイルをリンクしてDLL側の関数を呼び出しています。
(アプリ側でDLL側のヘッダのみをインクルードしています)
その場合もコールバック関数のアドレスは渡せるのでしょうか?
以前、DLLを動的リンクして渡したことはあるのですが。。。
すいません、意味不明なことを言いました。
とりあえず当初の問題は解決しましたので、終了にします。
静的リンクでも動的リンクでも問題ありません。
定義の仕方がよくわからなければちょっと前にコールバックの質問が
あったのでそちらを参考にしてください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200906/09060006.txt
επιστημηさんが書かれている例がそのまま使えるはずです。
subaru様、ありがとうございます。
既に解決になっていますが、質問させてください。
επιστημη様の例にならって書いてみたところ、
・DLL側
void call_Hoge(void (CALLBACK *func)(LPCTSTR lpStr))
{
}
・アプリ側
/* --- callback関数 --- */
void CALLBACK Hoge(LPCTSTR lpStr)
{
}
OnHogeFunc()
{
call_Hoge(&Hoge);
}
上記のようにしたところ、call_Hoge(&Hoge)で
error C2276: '&' : 仮想関数のアドレスを取ろうとしました。
とエラーになってしまいます。
どこが悪いんでしょうか?
クラスメンバになっている場合は、クラス定義の
Hogeメソッドにstaticキーワードがついている必要があります。
>OnHogeFunc()
> {
> call_Hoge(&Hoge);
>}
↓
OnHogeFunc()
{
call_Hoge(&HogeClass::Hoge);
}
という感じで。
できました!
subaru様、ありがとうございます。
本当に感謝です!