Форум: "Основная";
Текущий архив: 2004.06.27;
Скачать: [xml.tar.bz2];
ВнизВыполнение процедур из другого приложения Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.035 c