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

Вниз

Выполнение процедур из другого приложения   Найти похожие ветки 

 
vasko   (2004-06-10 04:37) [0]

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


 
Digitman ©   (2004-06-10 08:14) [1]


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


а вошло хоть ?


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


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


 
Stany ©   (2004-06-10 08:36) [2]

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


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

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

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;



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

Например процедуру:
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:39) [5]

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

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


 
Digitman ©   (2004-06-11 09:53) [6]


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


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


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


 
bars ©   (2004-06-11 11:32) [7]

Создать функцию обратного вызова из 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)(*); если нужны параметры
...

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


 
Stany ©   (2004-06-11 14:48) [8]

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


 
Anatoly Podgoretsky ©   (2004-06-11 14:56) [9]

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



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

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

Наверх




Память: 0.49 MB
Время: 0.03 c
3-1085963746
vasves
2004-05-31 04:35
2004.06.27
Удалены индексные файлы


3-1085826831
nitro
2004-05-29 14:33
2004.06.27
Как скопировать все строки из компонента Listbox в Dbgrid ?


14-1086892505
GanibalLector
2004-06-10 22:35
2004.06.27
][APKОВ !!!ту-ту-ту-тууу!!!туууу-тууууу!!!!


1-1087132315
Алекс
2004-06-13 17:11
2004.06.27
Как расшифровывается lp ?


10-1013693872
GenBr
2002-02-14 16:37
2004.06.27
Как узнать имя компьютера?