Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.02.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.46 MB
Время: 0.035 c
1-1107233486
Алексей Петухов
2005-02-01 07:51
2005.02.13
WMF PlayBack


14-1106638398
Чеширский_Кот
2005-01-25 10:33
2005.02.13
Черный бумер vs. Эдита Пьеха


1-1107142075
Yus
2005-01-31 06:27
2005.02.13
ListView в виртуальном режиме работает коряво


1-1107174744
ТехникПТО
2005-01-31 15:32
2005.02.13
Маленькая проблема


1-1106773427
Iron Man
2005-01-27 00:03
2005.02.13
Параметры и dll фукции





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский