質問

DelphiアプリケーションのリソースとしてXMLプログラムの設定をいくつか保存したいと思います。リソースは、ユーザーの変更に基づいて変更されます。 XMLを作成してリソースとしてロードするのに問題はありません。ロードするXMLDocumentを変更できますが、ドキュメントの書き方がわかりません。これも可能ですか?最後に2つのファイル(.exeおよび.xml)になってはいけません。

役に立ちましたか?

解決

答えはイエスとノーの両方です。

はい、Windows APIルーチンを使用してバイナリでリソースを更新することができます。 beginupdateresource()へのこのリンク そのスコアの正しい軌道に乗る必要があります。

ただし、beginupdateresource()の使用に関する次の条件に注意してください。

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

言い換えれば、アプリケーションが実行中に独自のリソースを単純に更新することは不可能です。

あなたが望むものを達成するためにあなたが採用できる多くの戦略があります - またはそれに十分近いものが満足のいくものです。最も適切なのは、正確なニーズに依存します。

多数のソリューションのうち、2つは次のとおりです。

1)そのようなすべてのリソースをdll(リソースのみのdll-実際のコードのみを含むリソースのみ)に維持します。これは、リソースを具体的にロードする(または更新する)場合にのみ開きます。したがって、リソースをDLLに書き戻したい時点で、必要な書き込みロックを取得できるはずです。

また

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

この2番目のアプローチは非常に乱雑で、「厄介な匂い」を持っていますが、たとえば自動アップデーターで非常に一般的に使用される(または使用されていた)テクニックです。現在の実行中のコードが変更されたEXEで更新されたリソースを使用するために、ある時点でアプリの再起動が含まれるため、ニーズに合っていない場合があります。

他のヒント

考慮すべきことは、ウイルス対策ソフトウェアがアクティビティに疑わしいものとしてフラグを立てる可能性があるということです。

Delticsの答えについて考えると、リソースをメインEXEに書き戻すコンソールアプリケーションを作成できると思いました。したがって、メインのexeはファイルへの変更を保存し、コンソールアプリも抽出します。メインアプリケーションが終了すると、コンソールアプリを呼び出します。コンソールアプリは短期間待機してから、リソースファイルをメインの実行可能ファイルにバインドし、リソースファイルとそれ自体を削除します。コンソールアプリは、リソースファイルが正常に記述されていることを確認するためにチェックを行うことができ、そうでない場合はリソースファイルを開いたままにします。メインの実行可能ファイルは、起動時にリソースファイルを表示し、埋め込まれたファイルの代わりに使用することができます - セーフガードとして。

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top