Само чтение исполняемого файла

Мне нужно прочитать данные, добавленные в конец исполняемого файла, изнутри этого исполняемого файла.
У меня проблема с win32: я не могу открыть .exe для чтения. Я пробовал CreateFile и std::ifstream.
Есть ли способ указать неэксклюзивный доступ для чтения к файлу, который изначально не был открыт с общим доступом.

РЕДАКТИРОВАТЬ. Отличная вещь в stackoverflow, вы задаете неправильный вопрос и получаете правильный ответ.


person Martin Beckett    schedule 13.11.2008    source источник
comment
Как данные были добавлены в конец исполняемого файла?   -  person Marcin    schedule 13.11.2008
comment
Он просто вставляет данные в конец исполняемого файла-заглушки, а затем помечает конец своего рода FAT. Как файловая система внутри самораспаковывающегося исполняемого файла.   -  person Martin Beckett    schedule 13.11.2008


Ответы (3)


Почему бы просто не использовать ресурсы, предназначенные для этой функциональности. Его не будет в конце, но он будет в исполняемом файле.

Если вы добавляете в .exe после его сборки — вам не нужно добавлять в конец, вы можете обновить ресурсы в созданном .exe

http://msdn.microsoft.com/en-us/library/ms648049(VS.85).aspx

person Lou Franco    schedule 13.11.2008
comment
Это не мой дизайн - кто-то другой генерирует файл, добавляя данные в исполняемый файл-заглушку. - person Martin Beckett; 13.11.2008
comment
Спасибо за ссылку - я не знал, что вы можете программно обновлять ресурсы без повторной ссылки. - person Martin Beckett; 13.11.2008

Мы делаем это в одном из наших проектов. В чем проблема? Если EXE запущен, то он уже открыт для чтения, и вы можете продолжать открывать его только для чтения несколько раз. Я только что проверил наш код, мы просто используем:

HANDLE file=CreateFile(filename, GENERIC_READ, FILE_SHARE_READ, 0, OPEN_EXISTING, 0, 0);

На сегодняшний день это работает без проблем во всех версиях 32- и 64-битной Windows.

person Head Geek    schedule 13.11.2008

У меня нет проблем с открытием исполняемого образа процесса с помощью любого из этих операторов:

FILE* f = fopen( fname, "rb");

hFile = CreateFile( fname, FILE_READ_DATA, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL); 

Какой у тебя код?

person Michael Burr    schedule 13.11.2008