Форум: "Основная";
Текущий архив: 2003.09.01;
Скачать: [xml.tar.bz2];
ВнизПодскажите ламеру как работать с указателями Найти похожие ветки
← →
-=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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.011 c