Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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
1-1418
MaXie
2003-08-19 15:04
2003.09.01
Как изменить иконку уже созданной формы?


3-1323
AndrewVolkov
2003-08-07 20:00
2003.09.01
Blob поле - непонятки с запросом...


3-1318
Riko
2003-08-11 09:57
2003.09.01
Обновление Grid связанного с Query


14-1549
Nikolay M.
2003-08-14 10:53
2003.09.01
Существует ли монитор запросов для MS SQL?


7-1692
Grinya
2003-06-14 13:49
2003.09.01
Как изьят иконку диска???





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский