Rambler's Top100
"Knowledge itself is power"
F.Bacon
Поиск | Карта сайта | Помощь | О проекте | ТТХ  
 Круглый стол
  
Правила КС
>> Настройки

Фильтр вопросов
>> Новые вопросы
отслеживать по
>> Новые ответы

Избранное

Страница вопросов
Поиск по КС


Специальные проекты:
>> К л ю к в а
>> Г о л о в о л о м к и

Вопрос №

Задать вопрос
Off-topic вопросы

Помощь

 
 К н и г и
 
Книжная полка
 
 
Библиотека
 
  
  
 


Поиск
 
Поиск по КС
Поиск в статьях
Яndex© + Google©
Поиск книг

 
  
Тематический каталог
Все манускрипты

 
  
Карта VCL
ОШИБКИ
Сообщения системы

 
Форумы
 
Круглый стол
Новые вопросы

 
  
Базарная площадь
Городская площадь

 
   
С Л С

 
Летопись
 
Королевские Хроники
Рыцарский Зал
Глас народа!

 
  
ТТХ
Конкурсы
Королевская клюква

 
Разделы
 
Hello, World!
Лицей

Квинтана

 
  
Сокровищница
Подземелье Магов
Подводные камни
Свитки

 
  
Школа ОБЕРОНА

 
  
Арсенальная башня
Фолианты
Полигон

 
  
Книга Песка
Дальние земли

 
  
АРХИВЫ

 
 

Сейчас на сайте присутствуют:
 
  
 
Во Флориде и в Королевстве сейчас  01:58[Войти] | [Зарегистрироваться]
Ответ на вопрос № 41386

05-04-2006 11:25
Подскажите пожалуйста пример кода,
чтобы запущенное приложение могло редактировать свои ресурсы.
Хочу в ресурсах хранить настройки приложения.
Не спрашивайте зачем, надо :)

[+] Добавить в избранные вопросы

Отслеживать ответы на этот вопрос по RSS

Ответы:


Уважаемые авторы вопросов! Большая просьба сообщить о результатах решения проблемы на этой странице.
Иначе, следящие за обсуждением, возможно имеющие аналогичные проблемы, не получают ясного представления об их решении. А авторы ответов не получают обратной связи. Что можно расценивать, как проявление неуважения к отвечающим от автора вопроса.

07-06-2006 12:00 | Комментарий к предыдущим ответам
но его можно переименовать
Вот тут был исходник по теме:
http://www.delphikingdom.com/asp/answer.asp?IDAnswer=41175

07-06-2006 11:33 | Комментарий к предыдущим ответам
BTW, запущенный exe'шник нельзя открыть на запись... но его можно переименовать. Т. е. переименовываем .exe файл, создаём новый с таким же именем и содержимым старого, а вот в него уже спокойно пишем. Единственный минус в том, что останется старая версия exe'шника с другим именем... Тут уже могут быть варианты: если файл этот не очень мешает, то удалить его можно при следующем запуске. Или при выходе запустить самого себя ещё раз с каким-нить параметром, чтобы новый процесс, дождавшись завершения старого, удалил файл.

04-06-2006 23:40
Python
1. экспериментальным путем выяснено: хэндл запущенного exe в системе WinXP SP2 в user-mode недоступен, как утверждают источники, в Win2K его можно найти.
2. даже если хэндл удастся найти, то он будет доступен только на чтение, придется изменять права доступа на него, это нетривиальная задача

04-06-2006 07:24
Могу предложить дикий способ. Попробуй открыть новый файл, узнаешь его Handle. Windows, как показывает мой опыт, выделяет Handle довольно последовательно, поэтому есть шанс, что в диапазоне +/- скажем $1000 найдется хендл нашего файла. Для каждого хендла из этого диапазона пробуем получить его размер, если он совпадает с размером нашего файла, то вполне вероятно, что это "наш клиент". Пробуем прочитать какие-нибудь данные, если получится и мы прочитаем ожидаемые данные - то это точно "наш клиент" и мы используем WriteFile, чтобы записать необходимую информацию. Правда, что делать, если подходящий нендл не найден я не знаю.

09-04-2006 05:59
Вместо *.bat можно юзать winscript - и из него редактировать файл

09-04-2006 05:52 | Комментарий к предыдущим ответам
То есть я не полный псих? Это радует...

09-04-2006 05:38
Почитав разную инфу, я понял, что единственный способ писать в запущенный ехе - открывать диск и писать напрямую в кластеры, но работает это только под XP

Наиболее реальные варианты -
1) создание времменной проги, которая будет запускаться после завершения главной проги и ее редактировать
2) создание копии главной проги, ее редактирование ,создание bat, который удалит старую ,переименует новую

08-04-2006 19:37
Не, зашибись, все работает... дописал ПР2 в конец первой, а первая открывает для чтения сама себя,  переписывает последние m байт в другой файл(m-размер ПР2) и запускает. Все перезаписывается... долго правдо...

08-04-2006 18:56
Я старые исходники посмотрел у меня там в одном файле несолько прог было, а моя только доставала из него нужную и запускала. А вот в нее саму скопировать я не пробовал, ибо эта идея - бредовая....

08-04-2006 18:46
Ой, какую я фигню написал... М-м-м, батюшки... Забудьте как страшный сон...

08-04-2006 16:06
С ресурсами все по аналогии, там даже константы не надо...

08-04-2006 16:02
Сразу попрошу не кидать в меня кирпичами и не говорить, что я псих... Я так делал и это работало...
Если нужно просто изменять какую-то инфу в своем exe то можно сделать так:

В основной программе (ПР1) объявить константу типа '<111@@@!!!@@@> n символов полезной ифнормации', где "<111@@@!!!@@@>" - некий ключ, а "n символов полезной ифнормации" - соответственно n символов полезной ифнормации....
Далее написать программу(ПР2), которая :
1. открывает файл 'XXX.txt' в котором есть три строки: адрес ПР1, ключ-строка, n символов полезной ифнормации, которяю нужно переписать.
2. В цикле ждет момента когда сможет редактировать файл ПР1(т.е. пока ПР1 не закроется)
3. Открывает файл ПР1 и ищет ключ-строку, после чего заменяет n символов полезной ифнормации находящихся после нее.
4. Удаляет 'XXX.txt'
5. Создает ,батник, который удалит ее саму и самого себя
6. закрывается
После компиляции ПР2 открываем ее в текстовом редакторе и копируем все как константу в ПР1.
При завершении работы ПР1 она создает два файла:
'XXX.txt' - в который записывает свой адрес, ключ-строку и измененные данные,
и 'XXX.exe' - в который записывает константу(т.е. exe ПР2)
После чего запускает этот самый XXX.exe и закрывается.

ПР1 читает нужную инфу из константы с ключем...

Разумеетя,  все эта фигня работает(если работает) только при наличии прав админа.

Я уже сказал, что это изврат, но иногда даже такая фигня может оказаться полезной...

07-04-2006 09:22
Если нужно редактировать ресурсы, так, как это делают программы типа Restorator и ResEdit,

то можно использовать процедуры из библиотеки MadTools :


            // open a dll/exe file for playing with the resources
function BeginUpdateResourceW (fileName      : PWideChar;
                              delExistingRes : bool    ) : dword; stdcall;

// add, change or delete a resource
function UpdateResourceW (update  : dword;
                          type_    : PWideChar;
                          name    : PWideChar;
                          language : word;
                          data    : pointer;
                          size    : dword    ) : bool; stdcall;

// close the resource handle again, either save or discard the changes
function EndUpdateResourceW (update  : dword;
                            discard : bool ) : bool; stdcall;


http://help.madshi.net/madResUnit.htm
Но  изменить ресурсы в уже загруженной программе(dll) не получится - тк исполняемый файл заблокирован.

07-04-2006 03:14
мда. потратив час на поиски хэндла запущенного exe в системе пришел к выводу что найти его не удалось :-( ну ладно. тогда можно открыть девайс в RAW режиме и писать прямо в файл

06-04-2006 07:35 | Сообщение от автора вопроса
Интересует первый способ :)

06-04-2006 07:22
да, конечно, в памяти.
как записать в exe? есть 2 пути. один сложный, второй проще.

первый способ - отыскать хэндл вашего файла в системе и воспользовавшись им записать то что надо.

второй способ - пишете прогу которая будет изменять ресурсы в вашем exe а запускать ее будете перед закрытием программы

06-04-2006 01:36 | Сообщение от автора вопроса
SLoW:
Я так понял, это ресурсы изменяются в памяти,
а как потом это на диск сохранить?
Вот у Русиновича прожка handle.exe каким-то образом
закрывает хендл и потом можно удалять, изменять...

06-04-2006 01:01
не сможет

06-04-2006 00:57
Наверное так:


{$R test.res} //Your resource file

procedure ReadResourceString(var index: integer);
var
  buf: array[0..255] of Char;
begin
  Loadstring(hinstance, index, @buffer, 255);
  str := StrPas(buffer);
end;

procedure WriteResourceString(rs: PResStringRec; newStr: PChar);
var
  oldprotect: DWORD;
begin
  VirtualProtect(rs, SizeOf(rs^), PAGE_EXECUTE_READWRITE, @oldProtect);
  rs^.Identifier := Integer(newStr);
  VirtualProtect(rs, SizeOf(rs^), oldProtect, @oldProtect);
end;



Используются функции:
LoadString

[i]
The LoadString function loads a string resource from the executable file associated with a specified module, copies the string into a buffer, and appends a terminating null character.

int LoadString(

    HINSTANCE hInstance,           // handle of module containing string resource
    UINT uID,           // resource identifier
    LPTSTR lpBuffer,           // address of buffer for resource
    int nBufferMax            // size of buffer
  );           


Parameters

hInstance

Identifies an instance of the module whose executable file contains the string resource.

uID

Specifies the integer identifier of the string to be loaded.

lpBuffer

Points to the buffer to receive the string.

nBufferMax

Specifies the size of the buffer in bytes (ANSI version) or characters (Unicode version). The string is truncated and null terminated if it is longer than the number of characters specified.



Return Values

If the function succeeds, the return value is the number of bytes (ANSI version) or characters (Unicode version) copied into the buffer, not including the null-terminating character, or zero if the string resource does not exist. To get extended error information, call GetLastError.
[/i]
VirtualProtect
[i]
The VirtualProtect function changes the access protection on a region of committed pages in the virtual address space of the calling process. This function differs from VirtualProtectEx, which changes the access protection of any process.

BOOL VirtualProtect(

    LPVOID lpAddress,           // address of region of committed pages
    DWORD dwSize,           // size of the region
    DWORD flNewProtect,           // desired access protection
    PDWORD lpflOldProtect            // address of variable to get old protection 
  );           


Parameters

lpAddress

Points to the base address of the region of pages whose access protection attributes are to be changed.
All pages in the specified region must have been allocated in a single call to the VirtualAlloc or VirtualAllocEx function. The pages cannot span adjacent regions that were allocated by separate calls to VirtualAlloc or VirtualAllocEx.

dwSize

Specifies the size, in bytes, of the region whose access protection attributes are to be changed. The region of affected pages includes all pages containing one or more bytes in the range from the lpAddress parameter to (
lpAddress+dwSize). This means that a 2-byte range straddling a page boundary causes the protection attributes of both pages to be changed.

flNewProtect

Specifies the new access protection. You can specify any one of the following flags, along with the PAGE_GUARD and PAGE_NOCACHE protection modifier flags, as necessary:

Value           Meaning
PAGE_READONLY           Enables read access to the committed region of pages. An attempt to write to the committed region results in an access violation. If the system differentiates between read-only access and execute access, an attempt to execute code in the committed region results in an access violation.
PAGE_READWRITE           Enables both read and write access to the committed region of pages.
PAGE_WRITECOPY           Gives copy-on-write access to the committed region of pages.
PAGE_EXECUTE           Enables execute access to the committed region of pages. An attempt to read or write to the committed region results in an access violation.
PAGE_EXECUTE_READ           Enables execute and read access to the committed region of pages. An attempt to write to the committed region results in an access violation.
PAGE_EXECUTE_READWRITE           Enables execute, read, and write access to the committed region of pages.
PAGE_EXECUTE_WRITECOPY           Enables execute, read, and write access to the committed region of pages. The pages are shared read-on-write and copy-on-write.
PAGE_GUARD           Pages in the region become guard pages. Any attempt to access a guard page causes the operating system to raise a STATUS_GUARD_PAGE exception and turn off the guard page status. Guard pages thus act as a one-shot access alarm.The PAGE_GUARD flag is a page protection modifier. An application uses it with one of the other page protection flags, with one exception: it cannot be used with PAGE_NOACCESS. When an access attempt leads the operating system to turn off guard page status, the underlying page protection takes over.If a guard page exception occurs during a system service, the service typically returns a failure status indicator.
PAGE_NOACCESS           Disables all access to the committed region of pages. An attempt to read from, write to, or execute in the committed region results in an access violation exception, called a general protection (GP) fault.
PAGE_NOCACHE           Allows no caching of the committed regions of pages. The hardware attributes for the physical memory should be specified as "no cache." This is not recommended for general usage. It is useful for device drivers; for example, mapping a video frame buffer with no caching. This flag is a page protection modifier, only valid when used with one of the page protections other than PAGE_NOACCESS.


lpflOldProtect

Points to a variable that the function sets to the previous access protection value of the first page in the specified region of pages. If this parameter is NULL or does not point to a valid variable, the function fails.



Return Values

If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

Remarks

You can set the access protection value on committed pages only. If the state of any page in the specified region is not committed, the function fails and returns without modifying the access protection of any pages in the specified region.
The VirtualProtect function changes the access protection of memory in the calling process, and the VirtualProtectEx function changes the access protection of memory in a specified process.
The PAGE_GUARD protection modifier flag establishes guard pages. Guard pages act as one-shot access alarms. See Guard Pages for further discussion of guard pages.
[/i]

05-04-2006 12:06 | Вопрос к автору: запрос дополнительной информации
А зачем?

Добавьте свое cообщение

Вашe имя:  [Войти]
Ваш адрес (e-mail):На Королевстве все адреса защищаются от спам-роботов
контрольный вопрос:
Вода мокрая или сухая?
в качестве ответа на вопрос или загадку следует давать только одно слово в именительном падеже и именно в такой форме, как оно используется в оригинале.
Надоело отвечать на странные вопросы? Зарегистрируйтесь на сайте.
Тип сообщения:
Текст:
Жирный шрифт  Наклонный шрифт  Подчеркнутый шрифт  Выравнивание по центру  Список  Заголовок  Разделительная линия  Код  Маленький шрифт  Крупный шрифт  Цитирование блока текста  Строчное цитирование
  • вопрос Круглого стола № XXX

  • вопрос № YYY в тесте № XXX Рыцарской Квинтаны

  • сообщение № YYY в теме № XXX Базарной площади
  • обсуждение темы № YYY Базарной площади
  •  
     Правила оформления сообщений на Королевстве

    Страница избранных вопросов Круглого стола.
      
    Время на сайте: GMT минус 5 часов

    Если вы заметили орфографическую ошибку на этой странице, просто выделите ошибку мышью и нажмите Ctrl+Enter.
    Функция может не работать в некоторых версиях броузеров.

    Web hosting for this web site provided by DotNetPark (ASP.NET, SharePoint, MS SQL hosting)  
    Software for IIS, Hyper-V, MS SQL. Tools for Windows server administrators. Server migration utilities  

     
    © При использовании любых материалов «Королевства Delphi» необходимо указывать источник информации. Перепечатка авторских статей возможна только при согласии всех авторов и администрации сайта.
    Все используемые на сайте торговые марки являются собственностью их производителей.

    Яндекс цитирования