Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.09.01;
Скачать: CL | DM;

Вниз

Подскажите ламеру как работать с указателями   Найти похожие ветки 

 
-=GaLaN=- ©   (2003-08-18 15:24) [0]

Я получаю от указателя на функцию значение, которое она возвращает. Но когда указатель уничтожается, значение сбрасывается и D6 вылетает с ошибкой работы с памятью. Каким образом можно передать само значение, а не указатель на область памяти?


 
Skier ©   (2003-08-18 15:29) [1]

Используй разыменование (^)


 
Digitman ©   (2003-08-18 15:32) [2]


> -=GaLaN=-


поясни на своем примере, что , куда и как ты пытаешься передавать и пр.


 
-=GaLaN=- ©   (2003-08-18 15:36) [3]

А как? У меня не получилось - все равно ошибки выдает.
function GetInfo: TInfo;
var
LibHandle: THandle;
GetInfo: function(): TInfo; cdecl;
tmp: TInfo;
begin
LibHandle:=LoadLibrary(PChar("my.dll"));
if LibHandle>=32 then begin
@GetInfo:=GetProcAddress(LibHandle, "GetInfo");
if @GetInfo<>nil then begin
tmp:=GetInfo^;
Result:=tmp;
end;
@GetInfo:=nil;
end;
FreeLibrary(LibHandle);
end;

Как только происходит выход из функции - сразу ошибка.


 
pasha_golub ©   (2003-08-18 15:41) [4]

tmp:=GetInfo^;
ИМХО надо так
tmp:=GetInfo;


 
Skier ©   (2003-08-18 15:42) [5]

-=GaLaN=- © (18.08.03 15:36) [3]
1)Что есть TInfo
2) Соглашения о передаче параметров проверь.


 
mOOx_ ©   (2003-08-18 15:42) [6]

По моему тут
tmp:=GetInfo^;
галка не нужна. Да и вообще ты глянь, что в Exception"е написано, может трабл в длл?


 
Skier ©   (2003-08-18 15:43) [7]

GetInfo^; -> GetInfo;


 
-=GaLaN=- ©   (2003-08-18 15:46) [8]

Тогда я вызываю эту функцию:

var
mega: TInfo;
...
mega:=GetInfo;

mega не получает значения и выдает ошибку.


 
mOOx_ ©   (2003-08-18 15:49) [9]

Да ты посмотри и сообще всем, где ошибка, в длл или в твоем аппле?


 
-=GaLaN=- ©   (2003-08-18 15:51) [10]

Если писать через tmp:=GetInfo; без "^", то ошибки нет. Но как только я вызываю @GetInfo:=nil; то значение сбрасывается. Т.е. был получен указатель. :(


 
NAlexey ©   (2003-08-18 16:18) [11]

Повторю Skier^:
1) Что есть TInfo?
2) cdecl -> скорее всего stdcall
3) Я бы написал так:

function GetInfo: TInfo;
var
LibHandle: Cardinal;
GetInfo: function(): TInfo; stdcall;
tmp: TInfo;
begin
Result := {Что есть TInfo?};
LibHandle := LoadLibrary("my.dll");
if LibHandle <> 0 then
try
GetInfo:=GetProcAddress(LibHandle, "GetInfo");
if @GetInfo <> nil then
Result := GetInfo;
finally
FreeLibrary(LibHandle);
end;
end;


 
Andy_UA   (2003-08-18 16:38) [12]

Да всё дело тут в cdecl, NAlexey прав.


 
-=GaLaN=- ©   (2003-08-18 17:54) [13]

cdecl приходится использовать, чтобы подцепить библиотеку, написанную на С/С++. Это вроде не должно играть роли в указателях. Но как же быть?


 
PVOzerski ©   (2003-08-18 18:02) [14]

А самое смешное, так это то, что если stdcall-функцию по ошибке при импорте объявить как cdecl, так она, пожалуй, какое-то время почти корректно поработает. Может, даже юзер выйдет из программы раньше, чем грянет Stack overflow. Когда мне надо было разобраться, stdcall у меня или cdecl, я отслеживал значение ESP из ассемблерных вставок.


 
ermserg ©   (2003-08-18 18:06) [15]

Ubery FreeLibrary i zasun eyo v kakoye-nibud drugoye mesto.


 
PVOzerski ©   (2003-08-18 18:11) [16]

>function GetInfo: TInfo;
>var
> LibHandle: THandle;
> GetInfo: function(): TInfo; cdecl;
На месте компилятора я бы тут свихнулся... Неужели нельзя обозвать локальную процедурную переменную внутри функции иначе, чем саму функцию?!!!


 
PVOzerski ©   (2003-08-18 18:43) [17]

Продолжая свой предыд. пост:
BTW, здесь грабли и ищите. Коль скоро Вы себя назвали ламером (хотя пытаетсь делать не самые ламерские вещи, что делает Вам честь :^) ), осмелюсь напомнить две вещи.
1) Помимо предопределенной переменной Result, возвращаемое значение функции можно задавать и обращаясь к ней по имени, если оно находится в левой части выражения. Например, вот такое:
>GetInfo:=GetProcAddress(LibHandle, "GetInfo");
компилятор может попытаться понять как
Result:=GetProcAddress(LibHandle, "GetInfo");

2) Вас никто не обязывает давать процедурной переменной такое же имя, как фактически имеет присваемая функция. Например, не возбраняется
DllGetInfoFunc:=GetProcAddress(LibHandle, "GetInfo");



Страницы: 1 вся ветка

Текущий архив: 2003.09.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.037 c
6-1528
oduvan
2003-06-22 17:47
2003.09.01
Как написать прокси сервер?


1-1441
ArtAlex
2003-08-18 20:56
2003.09.01
Как можно отследить процесс?


14-1581
Ketmar
2003-08-13 21:04
2003.09.01
гениальное послание Варраксу. я чуть пивом не поперхнулся...


1-1388
ZDima
2003-08-16 14:35
2003.09.01
Проблемы с TThread...


14-1590
Romkin
2003-08-13 21:35
2003.09.01
Корреляции