IProgressDialogの起動/停止

[戻る]
rikizo 2007/02/10(土) 18:24:20
こんばんは。rikizoと申します。

下記↓のスレッドとも関係しますが...

[VS2005のコンポーネント]
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200701/07010057.txt

私もVC6であったプログレスダイアログが使いたかったのですが
VS2005では使えないようだったので、
代わりにIProgressDialogというやつを使ってみる事にしました。

しかしStopProgressDialog()を使ったあとに、
もう一度StartProgressDialog()を呼ぶと
戻り値が「E_UNEXPECTED」になって必ず失敗するんです。(下記★印部)

もう一度CoCreateInstanceを使えば何とかなるんですが、
あまり良い方法とは思えなかったし、
どこか私の使い方が間違っているのかも知れないと思って質問させて頂きました。
何かご存知でしたら教えて下さいませ。


<環境>(どちらでも同じ現象)
・VS2005   WinXP MFC(会社)
・VS2005EE WinXP SDK(自宅)


<サンプルコード>
int _tmain(int argc, _TCHAR* argv[])
{
  CONST DWORD MAX = 100;
  IProgressDialog* pIProgDlg;

  CoInitialize(NULL);       // COM初期化

  CoCreateInstance(CLSID_ProgressDialog, NULL, CLSCTX_INPROC_SERVER,
     IID_IProgressDialog, reinterpret_cast<LPVOID*>(&pIProgDlg));

  pIProgDlg->StartProgressDialog(
    NULL, NULL, PROGDLG_MODAL|PROGDLG_NOTIME, NULL); // ダイアログ起動

  // 〜〜〜〜〜ここで重い処理をする〜〜〜〜〜〜〜〜

  pIProgDlg->StopProgressDialog();    // ダイアログ停止


  // もう一回ダイアログを起動...できねぇ...orz
  pIProgDlg->StartProgressDialog(
     NULL, NULL, PROGDLG_MODAL|PROGDLG_NOTIME, NULL);   //  ★

  // 後始末
  pIProgDlg->Release();
  CoUninitialize();    

  return 0;
}

ITO 2007/02/12(月) 19:57:05
MSDN見てみたんですけど、WIN32-COMですね。
しかも、英文ですね。
みていると思いますが。
http://msdn.microsoft.com/library/default.asp?url=/library/en-
us/shellcc/platform/shell/reference/ifaces/iprogressdialog/iprogressdialog.asp

 pIProgDlg->StopProgressDialog();
は、停止どころか終了処理みたいですね。
再開は、「Timer」のあと 「pIProgDlg->StartProgressDialog」見たいですね。

rikizo 2007/02/12(月) 22:55:55
[[解決]]
お返事ありがとうございます。

MSDNは参考にしていましたが、
なにぶん英語なので斜め読み程度でした。

「Timer」は使ってないんですけど、
残り時間の表示を制御するメソッドのようですね。

あとソースでは「停止」と書いちゃいましたが。
正確には、ダイアログ自体をいったん非表示にしてから
その後、また再表示させたいんですよ。

そういう場合は素直にインスタンスを作り直す事にします。
ありがとうございました。

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