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

Вниз

Динамическая библиотека и указатель.   Найти похожие ветки 

 
novice_man ©   (2005-01-27 17:54) [0]

Уважаемые мастера, вот наткнулся:
вызываю функцию из библиотеки:

function GetINFO(FolderCFG: ShortString): pInfoData; StdCall; export;
begin
New(Result);
Result^.name_service := "xxxxxxxxxxxx";
Result^.type_service := 1;
end;

где, type
      pInfoData = ^tInfoData;
      tInfoData = record
                  name_service: String[25];
                  type_service: byte;
      end;

вызов
var
 INFO_data: pInfoData;
 nDLL: THandle;
 fGetINFO: function(FolderCFG: ShortString): pInfoData; StdCall;
begin
hDLL := LoadLibrary("service.dll");
if hDLL <> 0 then begin
   @fGetINFO := nil;
   @fGetINFO := GetProcAddress(hDevice, "GetINFO");
   if @fGetINFO <> nil then INFO_data := fGetINFO;
   FreeLibrary(hDLL);
   end;
end;

в общем класика, но вот только я пытаюсь обратиться к полям pInfoData (INFO_data^.name_service, INFO_data^.type_service), так AV..., при этом проверка Assigned(INFO_data) = true !?
Но если результатом библиотечной функции будет tInfoData (естественно переписав все под tInfoData), то все нормально.

ВОПРОС: если я не прав, то где, объясните пожалуйста.

З.Ы. ShareMem не использовался, нет длинных строк и динамических массивов.


 
MBo ©   (2005-01-27 18:27) [1]

Выделять и освобождать память стоит в одном месте. Если в DLL - то предусмотри в ней функцию освобождения. Если в хост-приложении - переделай функцию в процедуру, передавай указатель на структуру с уже выделенной памятью


 
novice_man ©   (2005-01-27 19:23) [2]

MBo ©   (27.01.05 18:27) [1]

Пробовал перед получением результата из функции dll инициализировать переменную "приемник" \
  ....
  @fGetINFO := nil;
  @fGetINFO := GetProcAddress(hDevice, "GetINFO");
  if @fGetINFO <> nil then begin
     New(INFO_data);
     INFO_data := fGetINFO;
     end;
  ....

результат аналогичный.

И еще как освободить память из-под переменной если она result функции?

Да и ошибка описанная Вам у меня обычно возникала когда я выгружал библиотеку, то есть когда происходило освобождение ресурсов, а тут выгрузка происходит нормально.

hDLL := LoadLibrary("service.dll");
try

finally if hDll <> 0 then FreeLibrary(hDLL); end;

у меня так, и все работает.


 
Alexander Panov ©   (2005-01-27 19:43) [3]

Поступай так, как это делается во многих функциях WIN32API:
1. выделяй память под запись в основном модуле
2. передавай указатель на запись в функцию
3. в dll заполняй эту запись.
4. в основном модуле освобождай память из-под записи.


 
novice_man ©   (2005-01-27 20:35) [4]

Alexander Panov ©   (27.01.05 19:43) [3]
Спасибо за дельный совет. Так и стану делать.


 
Юрий Зотов ©   (2005-01-27 22:08) [5]

> novice_man ©   (27.01.05 20:35) [4]

А разве в [1] сказано не то же самое?


 
REA   (2005-01-28 10:04) [6]

>при этом проверка Assigned(INFO_data) = true !?

А где оно присваивется в Nil? Может INFO_data := fGetINFO просто и не вызывается.



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

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

Наверх




Память: 0.48 MB
Время: 0.056 c
3-1105521527
Georji
2005-01-12 12:18
2005.02.13
Ошибка открытия...


9-1100229362
BDA
2004-11-12 06:16
2005.02.13
Японские кроссворды...


1-1107174711
Aleksandr.
2005-01-31 15:31
2005.02.13
Почему у меня результат упаковки zLib ом не открывается Winzip?


3-1106040041
Russko
2005-01-18 12:20
2005.02.13
ComboBox и БД


1-1107157336
Neznaika
2005-01-31 10:42
2005.02.13
Baltic_Charset