Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "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
15-1144384396
Хозяин
2006-04-07 08:33
2006.04.30
11-12 апреля по 1 каналу


3-1141905472
Xmen
2006-03-09 14:57
2006.04.30
Запрос к базе.


2-1144760457
ANB
2006-04-11 17:00
2006.04.30
Как в Ворде заменить кусочек параграфа ?


2-1144905410
Student iz KZ
2006-04-13 09:16
2006.04.30
Как производть локализацию приложения с помощью...


15-1144329389
DON
2006-04-06 17:16
2006.04.30
WinXP





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский