• ベストアンサー

インストーラと突然の電源断

VisualStudio2008のVC++でインストーラを作成しています。 ターゲットはXP/Vistaです。 CopyFile()でファイルをコピーして、ショートカットを作成し、レジストリを登録した直後ぐらいで電源断を発生させると、CopyFile()でコピーしたファイルで1Mを越すものがほとんど壊れています。またショートカットも無かったり、あってもショートカットの中身が壊れていたり(ショートカット先無し、作業フォルダも空)、レジストリもキーだけあって中身が無かったりします。 普通、これらの事象についてどうやって解決するのでしょうか? ちなみにCreateFileでキャッシュ無し指定をして書き込んでも、いきなり電源断するとファイルが壊れてしまっていました。 ノートPCだとあまり見られないのですが、デスクトップPCで顕著に見られます。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#208124
noname#208124
回答No.3

やりなおす以外に解決法なんてありませんがな FILE_FLAG_WRITE_THROUGH無しのFILE_FLAG_NO_BUFFERINGだけではデバイス側キャッシュのバイパスまでは指示されないんですよ デスクトップで顕著なのはその所為じゃないですかね

yossiy_7
質問者

お礼

回答ありがとうございます。 なんて優しい人だ! FILE_FLAG_WRITE_THROUGHをつけたら、確かに確実にディスクに書き込みますね。 ただし、ものすごい遅く、目標性能を大きく下回りました。 やりなおす事にしました。ありがとうございました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.4

>ショートカットの中身が壊れていたり(ショートカット先無し、 >作業フォルダも空)、レジストリもキーだけあって中身が >無かったりします ということに対して、「どこまで動いてどこで停止するか わからない以上なにが起こっても不思議ではない」だから、 インストーラで対処する方法なんて基本的にありませんよっと 書いたつもりですが。。。 >普通、これらの事象についてどうやって解決するのでしょうか? 具体的に、どういう状態で「解決」な(最終的にどうなってほしい) のかを提示せずに、感想だけ言われても困りますし、 「ロールバックする(元の状態に復元できるようにしておく)」 というのは別に何かをコピーしてとっておくという方法だけでなく、 例えばインストーラが作ったレジストリが残っていれば一旦消す など既に行われた作業を無かったことにするという方法です。 >ちょっと質問とズレた回答に思えます。 おそらく、何か勘違いされていると思います。

yossiy_7
質問者

お礼

他の方の対処は「インストーラで対処する方法」にあたらないでしょうか? また、ロールバックに関する記述は前回と矛盾する上、そのロールバックの処理をするのはインストーラなのだから「インストーラで対処する方法」にあたると思い、この記述自体で矛盾が生じています。 もう少し具体性のある記述をしていただければ、誤解無く伝わるかと思いますが、今のままでは上手く伝わってきません。 インストーラで対処しないでロールバックする方法がどのような方法なのか、それを見た人が組める程度に記述しないと、上記のように混乱するだけだと思います。 申し訳ありませんが、質問に対する回答は締め切らせていただきます。 ありがとうございました。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8536/19406)
回答No.2

>普通、これらの事象についてどうやって解決するのでしょうか? 通常、強制電源断による異常な事象は「無かった事」として無視します。 強制電源断によるファイル損傷は、OSそのものの正常動作が保証されない状態ですので、アプリケーションは「そういう状態」に対処する必要はありません。 インストーラを作成する場合は、以下の点にだけ注意して下さい。 「過剰なチェックを行って、インストールもアンインストールも出来ない状態にだけはしない事」 例えば「インストールしようとしたら既にインストール済みだと言われてインストールが続行できず、アンインストールしようとしたら削除すべきファイルが無いとかインストールされてないとか言われてアンインストールが続行できず」と言う状態になると、八方塞りになります(最悪、ユーザーにOS丸ごとの再インストールを強いる事になる) インストーラーの基本は、以下のようになります。 ・インストール済みの場合 インストール済みの場合は、ファイルとレジストリを上書きインストールします。 インストール済みだからと言ってインストールさせないようにしてはいけません。 なお、バージョンダウンの再インストールの場合は、アンインストールを行ってからインストールするようにすます(いきなり上書きインストールしてはいけません。新旧のファイルの整合性が取れなくなります) ユーザーが一部のファイルを間違って手動で削除した時に、上書きインストールで復旧できるようにしておく事が重要です。 ・インストール中の残骸が残っている場合(インストール済みと判断されなかった場合に限る) インストール中の残骸があったら、ファイルとレジストリの残骸を上書きしてインストールを進めます。 なお、上書きしようとしたファイルがロックされていて上書きできない場合のみ、エラーで中断して構いません(と言うか、中断するしかない) 残骸があるからと言ってインストール済みだと判断してはいけません。 アンインストーラーの基本は、以下のようになります。 ・インストール済みの場合(インストール済みと判断した場合に限る) もし、消すべきファイルやレジストリが既に無かったとしても、エラーにしてはいけません。さもないと「消せない残骸」が残ってしまいます。 ・インストールされてない場合 このケースは考慮しなくて構いません。なぜなら、この状態の時はアンインストーラーが存在しません。

yossiy_7
質問者

お礼

いろいろありがとうございました。 基本的には書かれた事は実装済みです。

全文を見る
すると、全ての回答が全文表示されます。
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.1

> 普通、これらの事象についてどうやって解決するのでしょうか? > ちなみにCreateFileでキャッシュ無し指定をして書き込んでも どんなことをしてもプログラムがどこまで動いてどこで停止するか わからない以上なにが起こっても不思議ではありません。 普通、電源断などの突発的なイレギュラは 通常業務の中で対処はしない物です。 もし行うにしても、 もしもの時のために、ある程度のソフトウェアでは、 インストール前に必要な(自分がこれから変更する)情報を バックアップし失敗や正常に終了しなかった場合は、 ロールバックして元に戻すなどの方法がとられます。 #これで完全に元通りになるかと言われれば怪しいですが。

yossiy_7
質問者

お礼

ちょっと質問とズレた回答に思えます。 アップデートやアンインストールにはロールバックは有効でしょうけど、インストールにはあんまり関係ない話題かな、と思いました。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • インストーラー作成ツールについて

    インストーラー作成ツールについて 無料のインストーラー作成ツールを探していますが、 下記機能を盛り込み作成できるツールはありますでしょうか? 1.C:\aaa.exe実行 2.C:\1\bbb.exe実行 3.C:\2\ccc.exe実行 1.2.3を順番に実行するインストーラーは作成可能ですかね。 またあるファイルをコピーし、ショートカットをデスクトップに作成する インストーラーも探しています。 どなたかご教授願います<(_ _)>

  • 自作でインストーラー

    現在、上司に市販ソフトのインストーラを 「自分のプログラムで作れ!」 といわれて困っています。>< なにを困っているかというと、 インストーラー自体の根本の仕組みが具体的にわからないのです。 ファイルをコピーして、レジストリに情報を書き込むというのはわかるのですが、 具体的にレジストリのどの場所に何を書き込めばいいのか、わかりません。 わかる方、よろしくお願いします。

  • AutoCAD LT 2008 のインストーラが出て困っています

    以前AutoCAD LT 2008をしようしていて、使わなくなったので、 アンインストールしたのですが、別の実行ファイル(全く関係ない、妻が使っている家計簿とかのデスクトップショートカットアイコン)をクリックするとAutoCAD LT 2008のインストーラが出てきます! windowsがAutoCAD LT 2008の環境設定をしている間お待ちください。 というのが出てきます ウィルスみたいにしつこく出て困っています どなたか アドバイスをお願いいたします! レジストリも多少はいじれます どこかにインストーラがもぐりこんでいるのでしょうか?

  • Windows7で動く上書きインストーラの作り方

    こんにちは。 インストーラの作り方で悩んでいます。 すでにインストールされているアプリケーションのファイルを一部だけ上書きしたいのですが、うまい方法がみつかりません。 これまでは、ファイルを手作業でコピーしてもらっていたのですが、Windows7になってセキュリティが厳しくなったため、手作業でのコピーができなくなりました。 自分個人のマシンであれば、無理やり管理者権限でコピーすることも可能なのですが、配布先のユーザーさんには技術のない人もいるため、その方法はとれません。 通常であれば、古いバージョンをアンインストールして再インストールということになるのでしょうが、レジストリを消去したくないのです。 そこで、上書きしたいファイルだけのインストーラを作ってみたのですが、上書き対象のファイルのバージョンが同じためか、上書きしてくれません。 いまのところ考えられる方法としては、 ・orcaを使って、.msiファイルのREINSTALLプロパティを書き換える。 ・上書き対象ファイルをバージョンを変えてビルドしなおす。 という方法がありそうなのですが、どれもスマートな感じがしません。 特に、上書き対象ファイルの変更はなるべく避けたいです。 Setup.iniファイルへの記述などで対処できればよいのですが、なにかよさそうな方法はありませんでしょうか? 現在の開発環境は、インストールするアプリの関係でVS.2003ですが、一応新しいバージョンもそろっていますので、インストーラだけ新しいバージョンのVSで作成することは可能です。

  • msiインストーラで、ショートカット作成

    VB6です。VisualStudioInstallerでインストーラを作成しています。ショートカットを、AllUserのデスクトップに作成したいのですが、ターゲットマシン上のファイルシステムに出てきません。特別なフォルダの追加でも出てきません。作成する方法は無いのでしょうか?

  • Office(2000)等を起動させると、Windowsインストーラーが出てきて・・・

    OfficeXPのインストールが失敗(レジストリのエラーとかでインストールできない)してOffice2000(Premium)をインストール、Officeを起動させたり、VisualStudio.netを起動させたりするたびにWindowsインストーラーが出てきて、「OfficeXPのCDを入れてください」と出てくるようになってしまいました。  そこでOfficeXPのCDを入れてみると、インストールが始まって、エラー起こしてロールバックします。 もう一つのPCでも同じ現象が起こります。 Office2000を再インストールしても解決しません。どなたか解決方法わかる人、教えてください お願いします。 OSはどちらのPCも、XP(Pro)です。

  • VS2005で作成したインストーラーから別のMSIファイルを呼び出す

    タイトルのとおり、VisualStudio2005でインストーラーを作成しているのですが、別のMSIファイルからのインストールをおこないたいシステムもあるから、カスタム動作にてexeを呼び出し、そのexeにてMSIファイルを実行するとWindowsInstallerの多重起動になりエラーを吐いて片方がインストールできません。何かいい方法はないでしょうか

  • インストーラーの作成

    こんにちは。はじめまして。 現在、Accessベースの簡単なツールを開発したのですが、先方よりインストール形式にして欲しいとのことでインストーラーを作らなければならなくなりました。 ただ、Visual studioなど開発向けのアプリは持ち合わせておらず、簡単に以下の要件でインストーラーを作れるツールを探しています。 ・本体のmdbとdbのmdbのフォルダセットを指定のディレクトリに単純コピー ・デスクトップとスタートメニューへ起動アイコン(ショートカット)の作成 ・AccessまたはAccessランタイムの存在チェック、無ければ同梱のランタイムのインストールが始まる やりたいことはこんな感じです。 何か良い方法、または良いツール等ご存じの方、お知恵を貸していただけますか。 よろしくお願いします。

  • 複数の既成インストーラを連係させられるようなインストーラはありますか

    Windows環境(Windows-XPが大半で、一部Windows-2000)にて、 インストーラを作成したいのですが、良いソフトがあれば教えてください。 出来ればフリーソフトで探しています。 やりたいこととしては、 1.既成のインストーラを複数呼び出し、順次インストールする。 2.各インストールの間に、普通のバッチ処理を絡めたい。 3.それらのことをパッキングしたようなインストールプログラムを作りたい。 たとえば・・・ 子インストーラ(既成のインストールプログラム)として、inst_a.exe, inst_b.msi, inst_c.exe の3つがあったとして、 それらを統合したインストーラを作りたい。(これを全体インストーラと呼びます) 1)全体インストーラは、1つの実行形式や自己解凍書庫になっていて、実行すると、上記の子インストーラ3つが復元される。 2)まず、inst_a.exe を呼び出し、そのインストールを実行する。 3)次に、inst_b.msiを呼び出す前に、ある指定したフォルダを丸ごと、別の指定したフォルダにコピーさせる。 4)inst_b.msi を呼び出し、そのインストールを実行する。 5)その後、ある指定したフォルダに、 ・指定したファイルがある場合は、そこで全体インストーラの処理を終了する。 ・指定したファイルがなければ、inst_c.exeを呼び出す。 6)inst_c.exe のインストールが行われれば、あるフォルダ内の指定したiniファイルを開き、 ある部分を書き換えて保存しなおし、全体インストーラの処理を終了する。 7)全体インストールが完了した後は、不要になった子インストーラを削除する。 こんな感じです。 このようなことが出来る「インストーラの作成ソフト」を探しています。 よろしくお願いいたします。

  • EXEを起動するとインストーラが起動してしまいます

    環境はwindows7proです。 質問のツールは、VisualBasic6で作成したツールで、DBとしてAccessを使用します。 インストーラ配布用にInstallShieldを使用しています。 DBを消した状態でEXEを起動すると「DBがありません」とメッセージを出すエラー処理をしてます。 xpで実行すると想定どおりの動作になります。 7で実行するとインストーラ?が起動し、消したDBをインストール元から勝手に復元してしまいます。 インストール元のファイルが無い時は、メディアの挿入を求められます。 この動作は、windows7の仕様でしょうか?それとも何かの組み合わせ(OSとインストーラなど)で発生する事象でしょうか? 事象が依存している機能が分からず調査が出来ない状況です。 よろしくお願いします。