Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вызов процедуру из EXE-файла [D7, Win95/98, WinME, WinXP]


Страницы:   1 2

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]

Может кто может посоветовать другой способо обменятся данными между двумя программами. Очень надо.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо