![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Выполнение процедур из другого приложения [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]
> что то бился целый день но ничего не вышло
а вошло хоть ?
> функцию или процедуру которая находится в программе
любопытно было бы узнать, где еще, кроме как в программе, может находиться функция или процедура ?