Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.30;
Скачать: CL | DM;

Вниз

Вызов процедуру из EXE-файла   Найти похожие ветки 

 
Shuma ©   (2006-02-10 10:55) [0]

Есть такая проблема надо вызвать функцию из запущенного приложения и получить результат. Что-то вроде того как вызвать функцию из DLL.


 
Digitman ©   (2006-02-10 11:25) [1]


> Есть такая проблема


Да, есть такая "проблема".
И что ?


 
XProger ©   (2006-02-10 11:49) [2]

Shuma, чем exe отличается от dll?


 
Shuma ©   (2006-02-10 12:49) [3]

В ехе-файле функция описана так
function GetString(strIn: string): string; StdCall;

В другой программе делаю так переменная func неопределяется и выбивает ошибку.

var Handle: THandle;
   func: function (strIn: string): string; StdCall;
...
   Handle:=0;
   try
     try
       Handle:=LoadLibrary(PChar(p+"ffServer.exe"));
       @func:=GetProcAddress(Handle,"GetString");
       CheckStr(func(s));
     except
       ;
     end;
   finally
     FreeLibrary(Handle);
   end;
...


 
kaZaNoVa ©   (2006-02-10 12:54) [4]

тут раньше помню кто-то экспериментировал с вызовом функций из EXE по типу DLL (loadlibrary() и т.д.)  но имхо ничего хорошего не вышло..
а чем DLL  не устраивает?
или надо чтобы всё было в одном файле?


 
kaZaNoVa ©   (2006-02-10 12:56) [5]

Shuma ©   (10.02.06 12:49) [3]
а где експорт? :)


 
Digitman ©   (2006-02-10 13:02) [6]


> неопределяется


Значит не экспортируется.


> выбивает ошибку


Чем выбивает ? Дубиной ?) Что за жаргон дворовый ?)

p.s.

Читать про загрузку РЕ-модулей в Win32 до полного просветления !


 
iva ©   (2006-02-10 13:07) [7]

>В ехе-файле функция описана так
>function GetString(strIn: string): string; StdCall;
добавь
exports GetString;


 
Игорь Шевченко ©   (2006-02-10 13:13) [8]

Не получится


 
Shuma ©   (2006-02-10 13:18) [9]

Все проставил. Но теперь ошибка доступа по адресу в памяти -
"... raised too many consecutive exceptions ..."


 
Shuma ©   (2006-02-10 13:20) [10]

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


 
Digitman ©   (2006-02-10 13:22) [11]

Удалено модератором


 
Leonid Troyanovsky ©   (2006-02-10 13:24) [12]


> kaZaNoVa ©   (10.02.06 12:54) [4]
> тут раньше помню кто-то экспериментировал с вызовом функций
> из EXE по типу DLL (loadlibrary() и т.д.)  но имхо ничего
> хорошего не вышло..


Конечно, не выйдет.
Если адрес функции (и ее прототип) известен, то можно сделать так:
- запустить искомый exe;
- устанавить на его первичный поток хук;
- в хуковой процедуре подготавить параметры, сделать вызов и
возвратить результат установившему хук приложению (WM_COPYDATA).

Во избежании неприятностей полученную в хуке строку не модифицировать.

Если же адрес установить невозможно, то лучше выкинуть все
на помойку, и делать честный COM/OLE server.


 
Digitman ©   (2006-02-10 13:26) [13]

DDE , СОМ/DCOM, ОLЕ - в ту же дыру (см. [11])


 
iva ©   (2006-02-10 13:35) [14]

>Все проставил. Но теперь ошибка доступа по адресу в памяти -
>"... raised too many consecutive exceptions ..."

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


 
iva ©   (2006-02-10 13:43) [15]


>        Handle:=LoadLibrary(PChar(p+"ffServer.exe"));
>        @func:=GetProcAddress(Handle,"GetString");


func:=getprocAddress(GetModuleHandle(Pchar(PChar(p+"ffServer.exe"))))


 
Shuma ©   (2006-02-10 13:53) [16]


> iva ©


GetModuleHandle(PChar(p+"ffServer.exe")) - выдает 0 :(


 
iva ©   (2006-02-10 13:57) [17]

a ffServer.exe запущен?


 
Shuma ©   (2006-02-10 13:59) [18]


> iva ©

да


 
iva ©   (2006-02-10 14:00) [19]

пардон
 func:=getprocAddress(GetModuleHandle(Pchar(PChar(p+"ffServer.exe"))),PChar("GetString"));


 
kaZaNoVa ©   (2006-02-10 14:00) [20]

а LoadLibrary(PChar(p+"ffServer.exe")); что выдаёт?


 
kaZaNoVa ©   (2006-02-10 14:01) [21]

старое обсуждение подобной задачи:
Конференция: [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)



 
iva ©   (2006-02-10 14:06) [22]


> а LoadLibrary(PChar(p+"ffServer.exe")); что выдаёт?

???


 
iva ©   (2006-02-10 14:07) [23]

PChar(p+"ffServer.exe") - это полный путь?


 
Shuma ©   (2006-02-10 14:11) [24]

Странно.
Handle:=GetModuleHandle(PChar(p+"ffServer.exe"));   ->   Handle = 0
Handle:=LoadLibrary(PChar(p+"ffServer.exe"));           ->   Handle <> 0


 
iva ©   (2006-02-10 14:30) [25]

Часто использую получение данных для dll, вызывая ф-ю, которая находится в вызвавшем ее (dll) exe, т.е. dll запускает ф-ю из exe. Возможно, что exe<->exe не катит.


 
Digitman ©   (2006-02-10 14:59) [26]


> Shuma


Займись исследованиями ИНЫХ IPC-технологий/


 
XProger ©   (2006-02-11 01:39) [27]

Ну раз, автор темы, сам не понимает чего хочет, то рискну посоветовать SendMessage...


 
kaZaNoVa ©   (2006-02-11 02:44) [28]

по сабжу - как там,  процедуру из EXE-файла вызвали?))


 
n0name   (2006-02-11 11:46) [29]

http://www.wasm.ru/forum/index.php?action=vthread&forum=3&topic=13377



Страницы: 1 вся ветка

Текущий архив: 2006.04.30;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.029 c
3-1141715751
neat
2006-03-07 10:15
2006.04.30
Обновление грида после Update


3-1141957031
Exciter
2006-03-10 05:17
2006.04.30
Внести значения параметров TQuery


15-1144645947
Ega23
2006-04-10 09:12
2006.04.30
С Днём рождения! 10 апреля


15-1144339505
Isaev
2006-04-06 20:05
2006.04.30
Проблема компиляции...


2-1145028230
elfebet
2006-04-14 19:23
2006.04.30
как при помощи IdHTTP запустить браузер по умолчанию?