質問: windowsapi filecopyoperation vistaで動作が違います windowsapi filecopyoperationをwindows2000で使っていたのですが、vistaで動作させたら、若干動作が違います。 コピー元のファイルがない場合、2000では、「ファイルがコピーできません・・・」というエラーメッセージが表示されるだけですが、vistaでは、「・・・確認してから、操作を再実行してください」というメッセージで、「再試行」、「キャンセル」という二つのボタンから選べるようになっています。(再試行を選択しても何もおきません) 従来のように、単なるエラーメッセージにするようにできないでしょうか。
回答: 同じwindowsの名前がついているからといってメジャーバージョンの違う2つのosに 100%互換を期待するべきではありません。他にもimeに関する関数もvistaとxpでは 挙動が違うものがたくさんあります。 >「再試行」を押してもコピーされません。 それはコピー元のファイルが無いからでは?作ってもコピーされませんか? ためしにコードを書いてvistaで実行してみましたが ファイルを作成して再試行ボタンを押すと動きました。(下記vc++のコード) filecopyoperationと書いてあるということはvbか何かで呼び出してますよね? 実際はshell32.dllの中にあるshfileoperationa(unicodeの場合はshfileoperationw)が呼ばれています。 >設計ミスではないですか? これが設計ミスなのだとするとwindows2000に対するwindowsxpも設計ミスということになります。 2000とxpだって、wndprocの挙動が違ったりします。 osのメジャーバージョンアップの過程ではwindowsに限らず起きる話です。 vista対応は各社(各人)が苦しめられていると思いますが他のosと比べれば windowsの旧バージョンとの互換性は相当高い部類です。 (それがwindowsが普及している一つの理由ですし。) この件に限れば単にファイルの有無を前もってチェックして なければ共通のダイアログを出せば解決する話だと思います。 tchar path[1024]; tchar from[1024]; tchar to[1024]; getmodulefilename( null , path , 1024 ); int nlast = 0; for(int i = lstrlen(path)-1 ; i >= 0 ; i-- ){ if (path[i] == _t('\\')){ nlast = i;// unicode前提 break; } } path[nlast] = _t('\0'); lstrcpy( from , path ); lstrcpy( to , path ); lstrcat( from , _t("\\a.txt") ); lstrcat( to , _t("\\b.txt") ); from[ lstrlen(from) + 1 ] = _t('\0'); to[ lstrlen(to) + 1 ] = _t('\0'); shfileopstruct fileop; zeromemory( &fileop , sizeof(shfileopstruct) ); fileop.pfrom = from; fileop.pto = to; fileop.hwnd = null; fileop.fflags = fof_multidestfiles; fileop.wfunc = fo_copy; fileop.fanyoperationsaborted = false; fileop.hnamemappings = null; fileop.lpszprogresstitle = _t("title"); shfileoperation(&fileop );