2011-10-19 5 views
0

いくつかのXMLプログラムの環境設定をDelphiアプリケーションのリソースとして保存したいと思います。リソースはユーザーの変更に基づいて変更されます。 XMLを作成してリソースとしてロードすることに問題はなく、ロードするxmlDocumentを変更できますが、ドキュメントの書き戻し方法はわかりません。これも可能ですか?私は最終的に2つのファイル(.exeと.xml)で終わらないことを好むだろう。プログラムはどのようにして独自のリソースを変更できますか?

+2

これは通常の設定管理方法ではありません。なぜ外部のXMLファイルが必要ないのか聞いてもよろしいですか?設定XMLファイルは '%APPDATA%/ CompanyName/ProductName/ProductVersion'に保存する必要があります。また、レジストリを使用してデータを保存することもできます。ポータブルアプリケーションがUSB大容量記憶装置にある場合は、XMLファイルをEXEファイルの横にUSBデバイスに保存する必要があります。何らかの奇妙な理由のために、あなたが本当に '埋め込み' XMLを変更する必要がある場合、おそらく* 2番目の実行可能ファイル*が必要です。 –

+1

しないでください。設定を別のファイルに保存します。 –

+0

実行するのが簡単だったとしても、ユーザーに実行可能ファイルを変更する権限がない場合(管理者権限を持つユーザーのみが権限を持つ必要があります)、デフォルトではプログラムファイルディレクトリにこのような設定が適用されます。実行ファイルは変更しないでくださいが、exeファイルと同じフォルダにxmlファイルを書き込むべきではありません(ユーザーが書き込み可能でない可能性があります)。保護されていない実行可能ファイルは、システムをセキュリティ上の観点から脆弱にするものです。 –

答えて

1

答えは「はい」と「いいえ」です。

はい、Windows APIルーチンを使用してバイナリでリソースを更新することは可能です。 This link to BeginUpdateResource()は、そのスコアの正しいトラックにあなたを取得する必要があります。

ただし、BeginUpdateResource()を使用することで、次の条件に注意します:

「リソースを更新するアプリケーションがあることが必要でバイナリファイルこのファイルへの書き込みアクセスを得ることができ 。 ; pFileNameによって参照されるファイルは現在実行できません。

つまり、実行中にアプリケーションが単に自身のリソースを更新することはできません。

あなたが望むものや満足できるものを得るのに十分なものを達成するためには、さまざまな方法があります。最も適切なのは、あなたの正確なニーズに依存します。

1)全てのこのようなDLL内のリソース(リソースのみDLLを維持 - 特異的リソースをロードするときにのみ開くような実際のコード)を含まない(または更新:ソリューションの多数の

、両者はあるかもしれませんそれら)。したがって、DLLにリソースを書き戻したいときは、必要な書き込みロックを取得できるはずです。

または

2)あなたは、リソースを更新する必要がありますが、現在の名前で新しいファイルを持っているように、「myapp.exeという」それをコピーし、「myapp.OLD」のようなものに、現在実行中のEXEの名前を変更します。 "myapp.exe"は実際には "myapp.old"なので、更新することができます。

この2番目のアプローチは非常に面倒で、「厄介な臭い」がありますが、たとえば自動更新プログラムでかなり一般的に使用されている技法です。現在の実行中のコードが変更されたEXEで更新されたリソースを利用する場合は、明らかにあなたのアプリを再起動する必要がありますので、必要に応じて適切でない可能性があります。

1

何か他の点を考慮する必要があります。ウイルス対策ソフトウェアは、このアクティビティを疑わしいものとしてフラグを立てる可能性があります。

Delticsの答えを考える私はあなたのリソースをメインのexeに書き戻すコンソールアプリケーションを作成することもできると思いました。したがって、メインのexeファイルに変更を保存し、コンソールアプリケーションを抽出します。メインアプリケーションが終了すると、コンソールアプリケーションが呼び出されます。コンソールアプリケーションは短時間待機した後、リソースファイルをメインの実行可能ファイルにバインドし、リソースファイルとそれ自身を削除します。コンソールアプリケーションは、リソースファイルが正常に書き込まれたことを確認し、そうでなければ、リソースファイルを開いたままにしておくことができます。主な実行可能ファイルは、起動時にリソースファイルを参照して、埋め込みファイルの代わりに使用することができます。

これはすべて、単一のユーザーアプリケーションを前提としています。

+0

コンソールアプリケーションは自分自身を削除できますか? (そうでなければ、コンソールアプリケーションはコンソールアプリケーションを削除するように指示するフラグを付けてメインの実行ファイルを開始してから終了することができます) –

+0

私は完全にはわかりません。バッチファイルは自分自身を削除することができます。しかし、おそらく彼らは特別なケースです。 –

+0

私はそれを試したところ、うまくいかなかった。バッチファイルは、実行可能なプログラムまたはプロセスではありません。むしろ、実際の実行可能プログラム(実際のプロセス)によって解釈される 'スクリプト'です。 –

関連する問題