![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Получить HANDLE незапущенного приложения [D6, XP]
Artem © (2008-02-04 01:39:00)Подскажите, пожалуйста, как получить handle незапущенного приложения, зная полный путь к нему?
Artem (2008-02-07 23:22:00) [1]Помогите разобраться.
Есть функция:
function ExtractRes2(What:THandle;ResType, ResName, ResNewName: string): Boolean;
var
Res: TResourceStream;
begin
Result := False;
Res := TResourceStream.Create(What, Resname, PChar(ResType));
try
Res.SavetoFile(ResNewName);
Result := True;
finally
Res.Free;
end;
end;
Пользуюсь так:
izd:=LoadLibraryEx(PChar(edit1.text),h,LOAD_LIBRARY_AS_DATAFILE);
if ExtractRes2(izd,'DATA','storage', pathTOstg+'\storage.smp');
Вроде все работает, но потом Access violation выдает. Что не правильно делаю?
Artem (2008-02-07 23:15:00) [2]Господа, объясните, пожалуйста
function LoadLibraryEx(lpLibFileName: PChar; hFile: THandle; dwFlags: DWORD): HMODULE; stdcall;
hFile - чем здесь является?
Ins (2008-02-04 13:20:00) [3]
> что вполне себе содержит слова из [0]
Я думаю, только автор может прояснить ситуацию :) Но что касается GetModuleHandle, то это подразумевает, что образ чужого процесса уже загруженв адресное пространство нашего, подтверждение чего в словах автора я не увидел ;-)
Skyle (2008-02-04 13:16:00) [4]
> Ins © (04.02.08 13:10) [9]
GetModuleHandle вернёт handle, пригодный для загрузки ресурсов, что вполне себе содержит слова из [0] и похоже по смыслу на [1] :)
Ins (2008-02-04 13:10:00) [5]
> Скорее > Германн © протелепатировал :)
Мне кажется - нет. GetModuleHandle не вернет дескриптор модуля, который не загружен данным процессом.
Skyle (2008-02-04 13:08:00) [6]
> {RASkov} © (04.02.08 13:01) [6]
> > Получить HANDLE незапущенного приложения
>
> Я что-то не в теме.... у него разве есть хэндл?)
> Или Artem таки допустил неточности в вопросе...
Скорее > Германн ©протелепатировал :)
Ins (2008-02-04 13:08:00) [7]
> у него разве есть хэндл?)
Вопрос сформулирован криво, но я так понимаю, имеется в виду не хэндл процесса, а дескриптор исполняемого модуля, необходимый для загрузки ресурсов. Учитывая, что этот дескриптор представляет собой адрес образа exe в памяти вызывающего процесса, абсолютно все равно, запущен ли exe или нет. Главное, чтобы он был загружен в АП вызывающего процесса.
{RASkov} (2008-02-04 13:01:00) [8]> Получить HANDLE незапущенного приложения
Я что-то не в теме.... у него разве есть хэндл?)
Или Artem таки допустил неточности в вопросе...
Ins (2008-02-04 12:13:00) [9]
> Необходимо для того, чтобы извлечь из ее ресурса файл. Оба
> приложения мои.
Я тут вот что подумал... Если оба приложения ваши, то может завести Resourсe-only DLL, и скинуть необходимые ресурсы туда? И оба ваши приложения будут грузить их из этой библиотеки?! Думаю, это будет логичнее и рациональнее. А загружать библиотеку так же, как и описано в [3] (LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE), работает гораздо быстрее чем просто LoadLibrary.
ketmar (2008-02-04 12:08:00) [10]где-то так, да.
Ins (2008-02-04 11:50:00) [11]Если я правильно понял вопрос, то порядок следующий:
1. LoadLibraryEx с флагом LOAD_LIBRARY_AS_DATAFILE - загружаем приложение в свое адресное пространство. Функция возвращает дескриптор исполняемого модуля - сохраняем его.
2. Используя полученный дескриптор, загружаем данные из ресурсов
3. FreeLibrary
Германн (2008-02-04 02:00:00) [12]
> Получить HANDLE незапущенного приложения [D6, XP]
>
> Artem (04.02.08 01:39)
>
> Подскажите, пожалуйста, как получить handle незапущенного
> приложения, зная полный путь к нему?
>
См. функцию GetModuleHandle в справке по WinAPI. Но не забудь прочитать и понять Remarks.
Artem (2008-02-04 01:52:00) [13]Необходимо для того, чтобы извлечь из ее ресурса файл. Оба приложения мои.