Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2020, 11:49   #1
JUDAS
фонатик DELPHI
Форумчанин
 
Аватар для JUDAS
 
Регистрация: 14.01.2008
Сообщений: 714
По умолчанию Возвращение из dll функции указателя на динамический массив

Здравствуйте господа ГУРУ С++

Вопрос банален но внятного ответа в Гугле не нашёл

Исходные данные:
Имеется вызывающий модуль, который вызывает функцию в DLL
Функция в DLL возвращается 0 или N элементов типа "typedef struct" в зависимости от параметров.

Собственно вопрос - как вернуть указатель на такой дамп элементов и как его потом освободить ?

Код:
type
  PPlanetParm = ^TPlanetParm;
  TPlanetParm = packed record
     name : array[0..63] of char;
     code : array[0..31] of char;
     Weight : double;
     RadiusM  : double;   
  ......  и.т.п
  end;

================== условно ===============
extern "C"
{

_MYDLL long int WINAPI getPlanetParam(int SystemCode, TPlanetParm& retArr)
{
    TPlanetParm * reference = 0;
    int count = SelectParamForDB(SystemCode, reference);

    if (reference && count )
    {
      retArr = new TPlanetParm[count];
      for (int i=0; i < count; i++)
         memcpy((&retArr+i), (reference +i), sizeof(TPlanetParm));

      delete reference;
    }
    return count;
}
.....
.....
.....
} // extern "C"

========================
Вызов
type
 TFuncPlanetParam= function (SystemCode: integer; arr : TPlanetParm) : integer; stdcall;


var func : TFuncPlanetParam;
     arr    : PPlanetParm;
     i, count : integer;
     lib : THandle;
begin
   lib := LoadLibrary("myastronomic.dll");
   func := TFuncPlanetParam(GetProcAddress(lib, 'getPlanetParam'));
   if Assigned(func) then
   begin
      count  := func(142501, arr);
      if Assigned(arr)  then
         FreeMem(arr); 
   end;
   FreeLibrary(lib); 
end;
95% сбоев и ошибок приложений, находится в полу метрах от монитора

Последний раз редактировалось JUDAS; 06.05.2020 в 12:02.
JUDAS вне форума Ответить с цитированием
Старый 06.05.2020, 16:27   #2
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,493
По умолчанию

Выделяете память new а освобождаете через FreeMem - это не кажется несколько странным?
Далее, во избежание всех тяжких, память выделенная одним модулем должна освобождаться им же - добавьте метод типа freePlanetParam
waleri вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Возвращение указателя на объект вместо самого объекта. Как долго протянет? WhiskasTM Общие вопросы Delphi 9 07.10.2014 12:23
Возвращение указателя на структуру millepetrozza Помощь студентам 2 15.03.2013 20:34
Возвращение из функции указателя на двумерный массив _J_ Общие вопросы C/C++ 2 29.12.2011 01:34
Передача в функцию указателя на динамический массив Airou Общие вопросы C/C++ 4 05.05.2011 17:07
Можно ли вернуть динамический массив из функции? worldcentre Помощь студентам 2 06.12.2007 02:37