imho.ws
IMHO.WS  

Вернуться   IMHO.WS > Компьютеры > Программирование
Опции темы
Старый 03.04.2003, 16:58     # 1
ReapeR
Advanced Member
 
Аватар для ReapeR
 
Регистрация: 09.08.2002
Адрес: Nab. Chelny, Tatarstan
Сообщения: 447

ReapeR МолодецReapeR МолодецReapeR Молодец
DLL

Delphi. Я инициализирую дллку, выполняю процедуру (в длл) все работает, но как только я выполняю её по второму разу, то выдает ошибку.
В процедуру передается указатель на динамический массив, процедура его заполняет. Если включить эту процедуру в сам проект, то все работает хорошо. Как правильно вызывать процедуры и функции из ДЛЛ?
__________________
-=Nomen est Omen=-
ReapeR вне форума  
Старый 07.04.2003, 22:11     # 2
Madness
KpTeaM
 
Регистрация: 31.10.2002
Адрес: Russia
Пол: Male
Сообщения: 3 261

Madness СуперБогMadness СуперБогMadness СуперБог
Madness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБогMadness СуперБог
ReapeR
>Как правильно вызывать процедуры и функции из ДЛЛ?
Кусок из статьи "Эксплуатационные 'режимы' использования динамически компонуемых библиотек.", кажется на delphi.mastak.ru было.
Цитата:
Статическая загрузка:

...
implementation

function ShowMyDialog(Msg: PChar): Boolean; stdcall; external 'project1.dll';
procedure SetValue(); cdecl; external 'some.dll';
...

Динамическая загрузка:

...
uses
...
type
{определяем процедурный тип, отражающий экспортируемую процедуру или функцию}
TMyProcType = procedure (flag : Boolean); stdcall;
TMyFuncType = function (Msg: PChar): Boolean; cdecl;
{эту операцию можно сделать непосредственно в разделе var процедуры, в которой вы будите загружать dll}
...
procedure TForm1.Button1Click(Sender: TObject);
var
SetValue: TMyProcType; {объявляем переменные процедурного типа}
ShowDialog: TMyFuncType;

// или можно было сделать так (в таком случае type... не нужен):
// SetValue: procedure (flag : Boolean); stdcall;
// ShowDialog: function (Msg: PChar): Boolean; cdecl;

Handle01, Handle02: HWND; {дескрипторы, загружаемых библиотек}

begin
Handle01:= LoadLibrary(PChar('project1.dll')); { загрузка dll }
try
@ShowDialog:=GetProcAddress(Handle01, 'ShowMyDialog'); { получаем указатель на необходимую процедуру}
ShowDialog(PChar('Dll function is working !!!')); { используем функцию }
except
ShowMessage('Ошибка при попытке использовать dll !');
finally
FreeLibrary(Handle01); { выгружаем dll }
end; { try }
end;
end.

Аналогично и с процедурой SetValue();
и т.д.

>как только я выполняю её по второму разу, то выдает ошибку.
Скорей всего че-нить не освобождаешь/переполняешь и т.д.
__________________
Над струнами вен моих
Лезвия осени,
Их сталь леденящая
В просинь рук просится...
©Темнозорь
Madness вне форума  
Старый 09.04.2003, 11:42     # 3
ReapeR
Advanced Member
 
Аватар для ReapeR
 
Регистрация: 09.08.2002
Адрес: Nab. Chelny, Tatarstan
Сообщения: 447

ReapeR МолодецReapeR МолодецReapeR Молодец
Посмотрите пожалуста на этот код, может найдете где ошибка.
Вложения
Тип файла: rar dll.rar (47.7 Кбайт, 3 просмотров - Кто скачивал? )
__________________
-=Nomen est Omen=-
ReapeR вне форума  


Ваши права в разделе
Вы НЕ можете создавать новые темы
Вы не можете отвечать в темах.
Вы НЕ можете прикреплять вложения
Вы НЕ можете редактировать свои сообщения

BB код Вкл.
Смайлы Вкл.
[IMG] код Выкл.
HTML код Выкл.

Быстрый переход


Часовой пояс GMT +4, время: 11:48.




Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.