![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL [D6, WinXP]
Konsul © (2004-08-02 08:53:00)Здравствуйте, уважаемые мастера!
У меня возникла такая проблема, с которй сталкивается, наверное, каждый начинающий в области dll.
Проблема вот в чём. Задаю в dll функцию, возвращающую значение string. Сама программа работает с dll следующим образом:
задаём переменные:
type TGetStr=function: string; stdcall;
var
Hinst: THandle;
FPointer: TFarProc;
GetStr: TGetStr;
s: string;
Затем выполняем слeдующие действия:
HInst:=LoadLibrary(PChar('test_dll.dll'));
if HInst<=0 then begin messagedlg('DLL глючит!',mtError,[mbOk],0); exit; end;
FPointer:=GetProcAddress(Hinst,PChar('GetStr'));
if FPointer<>nil then
begin
GetStr:=TGetStr(FPointer);
s:=GetStr;
end;
если в самой dll возвращяемое значение задать прямым значением или переменой, относящейся к данной функции, т.е.
function GetStr: string; stdcall;
begin
result:='Test string!';
end;
то прога получает это значение, но потом пишет ошибку EInvalidPointer with message "Invalid Pointer operation". Но если задать result так:
function GetStr: string; stdcall;
begin
result:=s;
end;
где s - более глобальная переменна, значение которой задаётся какой-либо другой процедурой, то никаких ошибок нет. Странно!...
Мастера, помогите разобраться, в чём дело! Заранее благодарен!
Думкин (2004-08-02 09:00:00) [21]А ты пробовал читать комментарий вверху dll, когда был создан ее юнит. Он не только для красоты.