Доброго всем времени суток, у меня появился вопрос о том как выполнить из Dll-библиотеки запускаемой моей программой функцию или процедуру которая находится в программе. а также как выполнить процедуру находящуюся в главном файле "*dpr" из модуля этой же программы. что то бился целый день но ничего не вышло, кто знает подскажите плз.
Заранее спасибо.
Здравствуйте, Аноним, Вы писали:
А>Доброго всем времени суток, у меня появился вопрос о том как выполнить из Dll-библиотеки запускаемой моей программой функцию или процедуру которая находится в программе. а также как выполнить процедуру находящуюся в главном файле "*dpr" из модуля этой же программы. что то бился целый день но ничего не вышло, кто знает подскажите плз.
Если позволяет архитектура, то можно просто использовать сообщения, например, функцию PostThreadMessage.
Если нет, то можно использовать callback-функции — скажем в DLL определить функцию инициализации:
typedef void (*func_prototype)();
func_prototype func_pointer;
void InitCallbacks(func_prototype* f) {
func_pointer = f;
}
а в главной программе ее вызвать:
void func() {...}
...
InitCallbacks(func);
Есть и другие способы — все зависит от архитектуры приложения...
Здравствуйте, Nuald, Вы писали:
дело в том что я пишу на делфях и не знаком с си++
ф структура вызова длл следующая: вызываем из *.dpr файла и ставим обработчик событий
procedure ShowDLLForm(hWnd: THandle);
type
// Прототип функции из DLL. Напрямую написать Uses нельзя, т.к.
// при этом в проект скомпилируется и форма.
TDoDLLForm = function (lpNewHint: PChar; iSize: Integer): Boolean; stdcall;
const
FormRunning: Boolean = FALSE;
// Флаг "Форма загружена". Для предотвращения повторной загрузки
// формы
var
hDLL: THandle;
DoDLLForm: TDoDLLForm;
Buffer: array[0..50] of Char;
begin
if FormRunning then
Exit;
hDLL := LoadLibrary('resurs.dll');
if hDLL = 0 then
MessageBox(0, 'No library resurs.dll 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;
обработчик событий:
[pascal]
Application.Initialize;
dm:=Tdm.Create(nil);
ShowWindow(hWnd, SW_HIDE);
Application.Run;
// Цикл обработки сообщений
while GetMessage(Msg, 0, 0, 0) do begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
[/pascal]
Здравствуйте, vasko, Вы писали:
V>дело в том что я пишу на делфях и не знаком с си++
Я лишь обрисовал принцип, на чем реализовывать — не важно
V>ф структура вызова длл следующая: вызываем из *.dpr файла и ставим обработчик событий
Так в чем проблема? Из DoDLLForm вызывать функции проекта? Так и делать, как я описал — либо через сообщения, либо через callback-функции. Единственное, я не помню как на дельфях это делать, не охота ставить... ИМХО Дельфи годится только для написания прототипов...