Можно ли открыть файл fstream, если он уже запущен? - PullRequest
0 голосов
/ 08 января 2019

У меня есть случай, когда мне нужно открыть MyProg.exe после его запуска, внести некоторые изменения и сохранить его снова, заменив себя. Мы привыкли называть этот самоизменяющийся код, который получил название серьезно плохого кода. Тем не менее, у меня есть настоящий вариант использования в белой шляпе, и я бы хотел это сделать.

Этот код не открывается при открытии:

std::fstream inOutFile;
inOutFile.open( exePathName, std::ios_base::in | std::ios_base::out | std::ios_base::binary );
if( inOutFile.is_open() )
{ …

Чтобы проверить, можно ли это сделать обычными командами, я создал программу MyTest.exe, запустил ее из командной строки и запустил скопированный MyText.exe из другой папки поверх MyText.exe, которая бегал. Нет проблем, поэтому я знаю, что есть некоторые команды системных файлов, которые заставят его работать. Я просто надеялся использовать переносимые идиомы ISO c ++ там, где смогу. Есть мысли?

EDIT1: Я обнаружил, что Windows теперь имеет полный набор функций восстановления и перезапуска приложений . За последние 2 года я заметил, что Microsoft стала намного лучше перезапускать приложения после, скажем, перебоев с питанием. Я подозреваю, что это связано с разработкой этого API. Fx, функция RegisterApplicationRestart решает мою проблему отлично.

EDIT2: Мне пришлось отказаться от попыток использовать функции приложений и восстановления Microsoft для сохранения состояния командной строки. Они были слишком строгими и работали только для необработанных исключений и отсутствия реакции, а затем им требовались интерактивные пользовательские экраны. Fx, они бы не работали, если бы у вас было отключение питания, и вы просто хотели, чтобы ваше приложение использовало внутреннюю информацию о состоянии cmdline для перезапуска. Похоже, мне придется программировать самостоятельно.

...