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

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

Выполнение процедур из другого приложения [D6, Win95/98, Win2k]


vasko ©   (2004-06-10 04:37:00) 

Доброго всем времени суток, у меня появился вопрос о том как выполнить из Dll-библиотеки запускаемой моей программой функцию или процедуру которая находится в программе. а также как выполнить процедуру находящуюся в главном файле "*dpr" из модуля этой же программы. что то бился целый день но ничего не вышло, кто знает подскажите плз.
Заранее спасибо.


Anatoly Podgoretsky   (2004-06-11 14:56:00) [1]

bars ©   (11.06.04 11:32) [7]
ShareMem зачем?


Stany   (2004-06-11 14:48:00) [2]

Дополню bars.
> vasko чтобы вызывать функции (или работать с переменными) из модуля нужно (помимо включения в uses) их в этом модуле объявлять в интерфейсной части


bars   (2004-06-11 11:32:00) [3]

Создать функцию обратного вызова из DLL не очень трудно.
1. В файле *.dpr самой проги в разделе uses на первое место поставь ShareMem.
2. В файле *.dpr библиотеки в разделе uses на первое место поставь ShareMem.
3. В файле *.dpr библиотеки создай раздел type и напиши там что-то вроде:
TRemoteFunc=procedure; stdcall;
// или =procedure(*); или даже function(*):*; но она должна соответствовать вызываемому эквиваленту процедуры/функции из приложения

4. В файле *.dpr самой проги добавь новую процедуру/функцию, соответствующую вышеописанной переменной RemoteFunc. не забудь stdcall;
...
procedure MyProc; stdcall;

implementation

procedure MyProc; stdcall;
begin
*
end;
...

5. В файле *.dpr библиотеки создай глобальную переменную RemProc:TFarProc;
6. В файле *.dpr библиотеки создай процедуру, которая будет запоминать указатель на удаленную функцию. например:
...
procedure SetBackFunc(Proc:TFarProc);
begin
RemProc:=Proc;
end;
...
exports SetBackFunc;

ВСЕ! Теперь после загрузки библиотеки вызывай из приложения процедуру SetBackFunc - типа: SetBackFunc(FarProc(MyProc));
И теперь ты можешь вызывать Эту функцию из ДЛЛки:

...
TRemoteFunc(RemProc);
// или TRemoteFunc(RemProc)(*); если нужны параметры
...

Вроде все... может чего забыл...


Digitman   (2004-06-11 09:53:00) [4]


> у меня не выходит


> наоборот выходит очень даже


ты вообще-то в состоянии вразумительно и конкретно описать проблему ? Безо всяких там "выходит.. не выходит" ?


vasko   (2004-06-11 04:39:00) [5]

А также хотелось бы узнать как следующее: моя программа использует следующие модули.
uses
 Windows,
 Forms,
 Messages,
 TaskBar in 'TaskBar.pas',
 DataModule in 'Модуль данных\DataModule.pas' {DM: TDataModule};

и у меня не выходит вызвать из модуля 'DataModule.pas'
процедуру из программы.
хотя наоборот выходит очень даже хорошо.
например dm.Server.Active:=true;или че то на вроде.


vasko   (2004-06-11 04:32:00) [6]

Например процедуру:
procedure run;
begin
if not dm.Server.Active then dm.Server.Open;
TaskBarDeleteIcon(hWnd, ICON_ID);
TaskBarAddIcon(hWnd, ICON_ID, LoadIcon(hInstance, 'MAINICON'), WM_TASKBAR, Hint);
end;

или процедуру
procedure stop;
begin
if dm.Server.Active then dm.Server.Close;
TaskBarDeleteIcon(hWnd, ICON_ID);
TaskBarAddIcon(hWnd, ICON_ID, LoadIcon(hInstance, 'MAINICON1'), WM_TASKBAR, Hint_off);
end;


vasko   (2004-06-11 04:30:00) [7]

процедура вызова длл ки
и мне надо из длл вызвать процедуру из программы:

procedure ShowDLLForm(hWnd: THandle);
type
 // Прототип функции из DLL. Напрямую написать Uses нельзя, т.к.
 // при этом в проект скомпилируется и форма.
 TDoDLLForm = function (lpNewHint: PChar; iSize: Integer): Boolean; stdcall;
const
 FormRunning: Boolean = FALSE;
 Liblr = 'resurs.dll';
 // Флаг "Форма загружена". Для предотвращения повторной загрузки
 // формы
var
 hDLL: THandle;
 DoDLLForm: TDoDLLForm;
 Buffer: array[0..50] of Char;
begin
 if FormRunning then
   Exit;
 hDLL := LoadLibrary(Liblr);
 if hDLL = 0 then
   MessageBox(0, 'No library "'+Liblr+'" found', NIL, MB_OK)
 else begin
   DoDLLForm := GetProcAddress(hDLL, 'DoDLLForm');
   if Assigned(DoDLLForm) then begin
     try
       lstrcpy(Buffer, Hint);
       // Функции StrCopy требуют uses SysUtils, что сразу
       // увеличивает EXE файл на 25 Кбайт. Используем API
       // аналоги
       if DoDLLForm(@Buffer, SizeOf(Buffer)) then begin
         lstrcpy(Hint, Buffer);
         TaskBarModifyIcon(hWnd, 1, NIF_TIP, 0, Hint);
       end;
     finally
     end;
   end;
 end;
 FreeLibrary(hDLL);
end;


Stany   (2004-06-10 08:36:00) [8]

это настолько базовые вещи... приведи примеры кода с вопросами по нему и тебе легко помогут все кому не лень


Digitman   (2004-06-10 08:14:00) [9]


> что то бился целый день но ничего не вышло


а вошло хоть ?


> функцию или процедуру которая находится в программе


любопытно было бы узнать, где еще, кроме как в программе, может находиться функция или процедура ?


Наверх

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