DLLとの橋渡し – プログラミング – Home

通知
すべてクリア

[解決済] DLLとの橋渡し


COF
 COF
(@COF)
ゲスト
結合: 15年前
投稿: 53
Topic starter  

知恵をお貸しください。

MFC VC2003でアプリとDLLを作成しています。

アプリ側で作成したアーカイブファイルの中身をツリー表示させるのに、
DLL側にアーカイブファイルのパスを渡して、DLL側で解凍させようと考えています。
しかし、ツリーコントロールはアプリ側にあるので、どうやってDLL側から
解凍したファイル名を取得しようか迷っています。

CStringArrayをDLL側に渡してファイル名取得後、アプリ側で表示させる、
といったことも考えたのですが、アーカイブファイルは何GBにもなる可能性もあり、
Array系ではパフォーマンスが心配です。

ダイアログデータをDLL側に渡すのも、汎用性があるDLLにしたいため、考えられません。

皆様はどうするのかお聞かせお願いします。


引用未解決
トピックタグ
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

たとえば…

DLL に書庫ファイルを渡したら、DLL 内でファイルリストを保持しておき、アプリにそ
のリストの「ハンドル」を返す。
アプリからは DLL の関数にハンドルを渡すと、リスト内のファイル名を1個ずつ取得で
きるようにする。
ハンドル解放関数を呼ぶと、DLL はファイルリストを開放する。

とか。

FindFirstFile に似ていますね。

ハンドルは、例えばファイルリスト(CArray とか)のポインタでも構いません。
ただし、アプリからはそれはあくまで「ハンドル」であってそれ以外ではないので、ア
プリ側でハンドルを CArray* にキャストしてアクセスしたりしてはいけません。
ハンドルから中身のデータを取り出す作業は全部 DLL にやらせます。DLL だけが、「ハ
ンドルは実は CArray* であること」を知っているわけです。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

処理に時間がかかるようであればDLL側にコールバック関数のアドレスを渡して
EXE側で処理する方法もあります。
(例えばCABファイルを解凍するFDICopyというAPIはファイルの展開中に
コールバック関数に通知する)
途中でキャンセルもできますしね。


返信引用
COF
 COF
(@COF)
ゲスト
結合: 15年前
投稿: 53
Topic starter  

aetos様、subaru様、有難うございます。

考えた結果、subaru様の方法で、
DLL側にコールバック関数のアドレスを渡して、
DLL側でファイルが見つかる度にコールバック関数を呼び出して
ファイル名をアプリ側に渡す。という方法をとることにします。

そこで、コールバック関数はあまり使ったことがないので教えて頂きたいのですが、
現在、アプリ側ではLIBファイルをリンクしてDLL側の関数を呼び出しています。
(アプリ側でDLL側のヘッダのみをインクルードしています)
その場合もコールバック関数のアドレスは渡せるのでしょうか?

以前、DLLを動的リンクして渡したことはあるのですが。。。


返信引用
COF
 COF
(@COF)
ゲスト
結合: 15年前
投稿: 53
Topic starter  

すいません、意味不明なことを言いました。
とりあえず当初の問題は解決しましたので、終了にします。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

静的リンクでも動的リンクでも問題ありません。
定義の仕方がよくわからなければちょっと前にコールバックの質問が
あったのでそちらを参考にしてください。
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200906/09060006.txt
επιστημηさんが書かれている例がそのまま使えるはずです。


返信引用
COF
 COF
(@COF)
ゲスト
結合: 15年前
投稿: 53
Topic starter  

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: '&' : 仮想関数のアドレスを取ろうとしました。
とエラーになってしまいます。
どこが悪いんでしょうか?


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

クラスメンバになっている場合は、クラス定義の
Hogeメソッドにstaticキーワードがついている必要があります。

>OnHogeFunc()
> {
> call_Hoge(&Hoge);
>}

OnHogeFunc()
{
call_Hoge(&HogeClass::Hoge);
}

という感じで。


返信引用
COF
 COF
(@COF)
ゲスト
結合: 15年前
投稿: 53
Topic starter  

できました!
subaru様、ありがとうございます。
本当に感謝です!


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました