![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Вызов процедуру из EXE-файла [D7, Win95/98, WinME, WinXP]
Shuma © (2006-02-10 10:55:00)Есть такая проблема надо вызвать функцию из запущенного приложения и получить результат. Что-то вроде того как вызвать функцию из DLL.
n0name (2006-02-11 11:46:00) [1]http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=13377
kaZaNoVa (2006-02-11 02:44:00) [2]по сабжу - как там, процедуру из EXE-файла вызвали?))
XProger (2006-02-11 01:39:00) [3]Ну раз, автор темы, сам не понимает чего хочет, то рискну посоветовать SendMessage...
Digitman (2006-02-10 14:59:00) [4]
> Shuma
Займись исследованиями ИНЫХ IPC-технологий/
iva (2006-02-10 14:30:00) [5]Часто использую получение данных для dll, вызывая ф-ю, которая находится в вызвавшем ее (dll) exe, т.е. dll запускает ф-ю из exe. Возможно, что exe<->exe не катит.
Shuma (2006-02-10 14:11:00) [6]Странно.
Handle:=GetModuleHandle(PChar(p+'ffServer.exe')); -> Handle = 0
Handle:=LoadLibrary(PChar(p+'ffServer.exe')); -> Handle <> 0
iva (2006-02-10 14:07:00) [7]PChar(p+'ffServer.exe') - это полный путь?
iva (2006-02-10 14:06:00) [8]
> а LoadLibrary(PChar(p+'ffServer.exe')); что выдаёт?
???
kaZaNoVa (2006-02-10 14:01:00) [9]старое обсуждение подобной задачи:
Конференция: [WinAPI]
Отличия EXE и DLL. LoadLibrary(EXE)
GrayFace © (15.06.05 0:42)
Пытался загрузить EXE, как DLL. LoadLibrary, а дальше перейти на EntryPoint. Не получается. Возможно, дело в том, что я не передаю ей параметров. Релоки exe сохранены.
В связи с этим вопросы:
1) Чем отличается EXE от DLL, кроме назначения EntryPoint и нужды в релоках?
2) Возможно ли загрузить EXE указанным образом так, чтобы она работала, как обычно?
3) Если нельзя, то зачем Delphi пихает релоки, даже если в exe нет экспортируемых функций?
--------------------------------------------------------------------------------
Digitman © (15.06.05 8:53) [1]
1) и ЕХЕ и DLL являются РЕ-модулями, с этой т.з. различий в них нет : релоки, импорт, экспорт и пр. - неотъемлемые атрибуты любого РЕ-модуля.
2) в принципе возможно, но зачем ?
3) мало ли способов использовать код EXE-модуля, загруженного как библиотеки, кроме вызова эксп.ф-ций ! ... код-то - позиционно-зависимый, без он релокации работать не сможет
--------------------------------------------------------------------------------
Digitman © (15.06.05 9:18) [2]
> LoadLibrary, а дальше перейти на EntryPoint.
что значит "перейти" ? поясни ...
--------------------------------------------------------------------------------
Игорь Шевченко © (15.06.05 10:22) [3]
> 2) Возможно ли загрузить EXE указанным образом так, чтобы
> она работала, как обычно?
Нет.
--------------------------------------------------------------------------------
Digitman
--------------------------------------------------------------------------------
> LoadLibrary, а дальше перейти на EntryPoint.
что значит "перейти" ? поясни ...
Digitman
--------------------------------------------------------------------------------
1) и ЕХЕ и DLL являются РЕ-модулями, с этой т.з. различий в них нет : релоки, импорт, экспорт и пр. - неотъемлемые атрибуты любого РЕ-модуля.
2) в принципе возможно, но зачем ?
3) мало ли способов использовать код EXE-модуля, загруженного как библиотеки, кроме вызова эксп.ф-ций ! ... код-то - позиционно-зависимый, без он релокации работать не сможет
Игорь Шевченко
--------------------------------------------------------------------------------
> 2) Возможно ли загрузить EXE указанным образом так, чтобы
> она работала, как обычно?
Нет.
GrayFace © (16.06.05 1:58) [4]
Digitman © (15.06.05 9:18) [2]
что значит "перейти" ? поясни ...
Втупую посмотрел ее адрес в PE Explorer, прибавил к HModule и сделал jmp. Вроде бы не промахнулся - попал на начало какого-то метода.
Digitman © (15.06.05 8:53) [1]
2) в принципе возможно, но зачем ?
Ради интереса.
Игорь Шевченко © (15.06.05 10:22) [3]
Нет.
Поясните, plz.
--------------------------------------------------------------------------------
Digitman © (16.06.05 8:43) [5]
> Ради интереса.
Тогда "ради интереса" прокомментируй свое "как обычно" ..
Ибо под "как обычно" подразумевается создание из ЕХЕ отдельного процесса, а для этого LoadLibrary() никаким боком не подходит..
--------------------------------------------------------------------------------
GrayFace
--------------------------------------------------------------------------------
Digitman © (15.06.05 9:18) [2]
что значит "перейти" ? поясни ...
Втупую посмотрел ее адрес в PE Explorer, прибавил к HModule и сделал jmp. Вроде бы не промахнулся - попал на начало какого-то метода.
Digitman © (15.06.05 8:53) [1]
2) в принципе возможно, но зачем ?
Ради интереса.
Игорь Шевченко © (15.06.05 10:22) [3]
Нет.
Поясните, plz.
Игорь Шевченко © (16.06.05 11:02) [6]
GrayFace © (16.06.05 01:58) [4]
> Поясните, plz.
Что именно ?
--------------------------------------------------------------------------------
Суслик © (16.06.05 11:57) [7]
Когда-то в молодости я страдал фигней: пытался в свой exe из другого своего же exe импортировать функции.
У меня ничего не вышло, т.к. судя по cpu для exe не делались релоки вызовов. Тогда ИШ сказал, что использовать exe таким образом невозможно.
ЗЫ. Оба exe были на delphi.
--------------------------------------------------------------------------------
Суслик
--------------------------------------------------------------------------------
Когда-то в молодости я страдал фигней: пытался в свой exe из другого своего же exe импортировать функции.
У меня ничего не вышло, т.к. судя по cpu для exe не делались релоки вызовов. Тогда ИШ сказал, что использовать exe таким образом невозможно.
ЗЫ. Оба exe были на delphi.
Digitman © (16.06.05 12:40) [8]
> Суслик © (16.06.05 11:57) [7]
дело там даже не в релоках, а в том что инициализация не выполнена
В случае с DLL система в ходе исполнения LoadLibrary :
- находит pe-модуль,
- грузит его как положено в АП вызывающего процесса (с релоками, настройкой импорта и пр.),
- обнаруживает признак того что это библиотека, получает ее DllEntryPoint и автоматически вызывает п/программу, адрес которой взят из DllEntryPoint, с параметром DLL_PROCESS_ATTACH
В результате происходит ожидаемая программная иниц-ция внутренних переменных, структур и пр. и пр., если алгоритм DLL это предусматривает (в ре-модулях, использующих VCL, это происходит обязательно)
В случае же с EXE никаких DllEntryPoint нет (есть просто EntryPoint иного смыслового назначения, нежели DllEntryPoint), соответственно система в ходе LoadLibrary не вызывает автоматически никаких п/программ из загруженного модуля и, соответственно, нет той самой иниц-ции, которая с успехом выполнилась бы при обычном использовании модуля (т.е. CreateProcess)
kaZaNoVa (2006-02-10 14:00:00) [10]а
LoadLibrary(PChar(p+'ffServer.exe'));что выдаёт?
iva (2006-02-10 14:00:00) [11]пардон
func:=getprocAddress(GetModuleHandle(Pchar(PChar(p+'ffServer.exe'))),PChar('GetString'));
Shuma (2006-02-10 13:59:00) [12]
> iva ©
да
iva (2006-02-10 13:57:00) [13]a ffServer.exe запущен?
Shuma (2006-02-10 13:53:00) [14]
> iva ©
GetModuleHandle(PChar(p+'ffServer.exe')) - выдает 0 :(
iva (2006-02-10 13:43:00) [15]
> Handle:=LoadLibrary(PChar(p+'ffServer.exe'));
> @func:=GetProcAddress(Handle,'GetString');
func:=getprocAddress(GetModuleHandle(Pchar(PChar(p+'ffServer.exe'))))
iva (2006-02-10 13:35:00) [16]>Все проставил. Но теперь ошибка доступа по адресу в памяти -
>"... raised too many consecutive exceptions ..."
м.б. это из-за того, что строку нельзя вот так просто передавать (если это не ShortString)
Digitman (2006-02-10 13:26:00) [17]DDE , СОМ/DCOM, ОLЕ - в ту же дыру (см. [11])
Leonid Troyanovsky (2006-02-10 13:24:00) [18]
> kaZaNoVa © (10.02.06 12:54) [4]
> тут раньше помню кто-то экспериментировал с вызовом функций
> из EXE по типу DLL (loadlibrary() и т.д.) но имхо ничего
> хорошего не вышло..
Конечно, не выйдет.
Если адрес функции (и ее прототип) известен, то можно сделать так:
- запустить искомый exe;
- устанавить на его первичный поток хук;
- в хуковой процедуре подготавить параметры, сделать вызов и
возвратить результат установившему хук приложению (WM_COPYDATA).
Во избежании неприятностей полученную в хуке строку не модифицировать.
Если же адрес установить невозможно, то лучше выкинуть все
на помойку, и делать честный COM/OLE server.
Digitman (2006-02-10 13:22:00) [19]Удалено модератором
Shuma (2006-02-10 13:20:00) [20]Может кто может посоветовать другой способо обменятся данными между двумя программами. Очень надо.