Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.038 c
14-1086615778
j
2004-06-07 17:42
2004.06.27
Есть новости?


1-1086978895
ThermiT
2004-06-11 22:34
2004.06.27
WordDocument Выравнивание в таблице


1-1086774265
[BAD]Angel
2004-06-09 13:44
2004.06.27
Вопрос про службу (сервис)


3-1086056822
ИМХО
2004-06-01 06:27
2004.06.27
О DBF-файлах


3-1085972910
Victor_A
2004-05-31 07:08
2004.06.27
Как узнать, что у базы данных сменили пароль





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский