Форум: "WinAPI";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
ВнизВызов процедуру из 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 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.04.30;
Скачать: [xml.tar.bz2];
Память: 0.53 MB
Время: 0.01 c