IMAPIでのCD-R書き込み中にキャンセルをするには?

解決


うみ  2005-06-21 22:35:26  No: 57998  IP: 192.*.*.*

VC++7.0においてIMAPIを使用してCD−R書き込みをするアプリケーションを作成していますが、書き込みに関しては実装できたのですが、書き込み中のキャンセルの実現方法がわかりません。
ヘルプとマイクロソフトのサンプルを参照したところ、IDiscMasterProgressEventsを継承したクラスを作成して、QueryCancelメソッドをそのクラス内で実装して使用するのかと思っているのですが、このQueryCancelの呼び出し方といいますか、使用方法がよくわかりません。
ご存知の方がおられましたら、ご教授お願いします。
OSはWindowsXPです。

編集 削除
シャノン  2005-06-22 14:48:06  No: 57999  IP: 192.*.*.*

能動的に(任意のタイミングで)キャンセルする方法は、IMAPI のリファレンスを斜め読みする限り、無いように思われます。
CD の書き込みは、過去に IMAPI を使わない CD コピーソフトを使ったときの経験から、キャンセルボタンを押しても即座に中止されないものと考えます。
すると、任意のタイミングでのキャンセルは不可能で、例えばある程度のまとまったデータを書き込み終わった後など、何らかのキリのいいタイミングでないとキャンセルできないのではないでしょうか。
そういうタイミングは、ユーザーにはわかりませんが、ドライブと IMAPI にはわかりますので、QueryCancel を実装してイベントを登録しておけば、「今ならキャンセルできるけど、どうする?」というタイミングで、IMAPI から勝手に呼んでくれるのでは、とか考えたりします。

#試してみたわけではないので、正解かどうかはわかりません。

編集 削除
うみ  2005-06-23 22:33:46  No: 58000  IP: 192.*.*.*

シャノンさん
ご返信ありがとうございます。
どうやらWindowsXPのSP2ではIMAPIのバグでキャンセルがうまく
動かないらしいです。
ですから実装はあきらめましたが、いまいちイベントの登録方法がわかりませんでした。
少し残念です。

編集 削除
シャノン  2005-06-24 15:01:51  No: 58001  IP: 192.*.*.*

> いまいちイベントの登録方法がわかりませんでした。

推測ですが、

1.IDiscMasterProgressEventsを継承したクラスを作成する
2.IDiscMaster::ProgressAdvise の第1引数に、このクラスのポインタを渡す
  この時、第2引数に返された値を覚えておく。

登録はこんな感じでしょう。
登録解除は

1.IDiscMaster::Progressadvise で第2引数に返された値を
  IDiscMaster::ProgressUnadvise に渡す

で、キャンセル方法は

1.キャンセルボタンが押されたら、そのことを内部変数に覚えておく
2.次回、IDiscMasterProgressEvents::QueryCancel が呼ばれたときに、
  内部変数の値を見て、キャンセルされていたら引数に TRUE を返す。

でいいんじゃないかな。

編集 削除
うみ  2005-06-26 16:03:58  No: 58002  IP: 192.*.*.*

シャノンさん
わざわざありがとうございました。
上記を参考にちょっとサンプルで作ってみようと思います。

本当にありがとうございました。

編集 削除