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

Вниз

Как правильно передать из DLL?   Найти похожие ветки 

 
Игорь ©   (2009-09-23 12:51) [0]

Подскажите как правильно передать из DLL TMyRecord а в приложении принять?

type
 TSomeRecord = record
   Value: Cardinal;
 end;

 TSomeRecord2 = record
   Value: Cardinal;
   ArrayOfSomeRecord: Array of TSomeRecord;
 end;

 TMyRecord = Array of TSomeRecord2;


 
Сергей М. ©   (2009-09-23 12:53) [1]

"Правильность" немало зависит от того, в какой среде разрабатывались хост-приложение и DLL


 
Медвежонок Пятачок ©   (2009-09-23 12:54) [2]

можно по ссылке, можно по значению. здесь без разницы


 
Медвежонок Пятачок ©   (2009-09-23 12:55) [3]

хотя структурка придумана явно в угаре.

хотя бы вот это чудо чего стоит
TSomeRecord = record
  Value: Cardinal;
end;


 
Игорь ©   (2009-09-23 13:01) [4]


> Сергей М. ©   (23.09.09 12:53) [1]


Delphi -> Delphi


 
Сергей М. ©   (2009-09-23 13:01) [5]


> структурка придумана явно в угаре


Ну это он, наверно, для примера)
Позже, видимо, планируется напихать туда полей всякоразных)


 
Сергей М. ©   (2009-09-23 13:03) [6]


> Игорь ©   (23.09.09 13:01) [4]


Тогда просто собери оба проекта с установленной опцией Build With Run-Time Packages. Больше никаких особенных телодвижений для достижения "правильности" не требуется.


 
Медвежонок Пятачок ©   (2009-09-23 13:07) [7]

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

то есть он уже что-то как-то передает, но в хост приложении получает кашу.


 
Игорь ©   (2009-09-23 13:20) [8]

dll

type
TSomeRecord = record
  Value: Cardinal;
end;

TSomeRecord2 = record
  Value: Cardinal;
  ArrayOfSomeRecord: Array of TSomeRecord;
end;

TMyRecord = Array of TSomeRecord2;
PMyRecord = ^TMyRecord;

function SomeFunction(var MyRecord: PMyRecord): Integer; stdcall;
var
 i: Cardinal;
begin
 Finalize(MyRecord^);
 SetLength(MyRecord^, 24);
 for i:= 0 to 23 do
   SetLength(MyRecord^[i].ArrayOfSomeRecord, 4);

 MyRecord^[12].ArrayOfSomeRecord[4].Value:= 35356;
end;


приложение

var
 MyRecord: PMyRecord;
begin
 GetMem(MyRecord, 100);
 SomeFunction(MyRecord);
 Caption:= IntToStr(MyRecord^[12].ArrayOfSomeRecord[4].Value);
 FreeMem(MyRecord);
end;
CODE>


 
Медвежонок Пятачок ©   (2009-09-23 13:23) [9]

ужас какой.

и кто тебе сказал, что после гетмема поле динамического массива будет указывать на то что оно должно указывать?


 
Игорь Шевченко ©   (2009-09-23 13:28) [10]

Sharemem использовать, согласно комментарию ?


 
Сергей М. ©   (2009-09-23 13:33) [11]


> Игорь ©   (23.09.09 13:20) [8]


> stdcall


Ты же сказал

> Delphi -> Delphi


??

Тогда с какой луны свалилось stdcall ?


 
Игорь ©   (2009-09-23 13:48) [12]


> Игорь Шевченко ©   (23.09.09 13:28) [10]


Но я не передаю Strings ни параметрах, ни как результат


 
Медвежонок Пятачок ©   (2009-09-23 13:49) [13]

а вообще веселый код.
сначала делаем гетмем на сто байт, затем в длл вызываем финалайз (пачиму не фримем и зачем вообще гетмем вызвали)

:)


 
Медвежонок Пятачок ©   (2009-09-23 13:50) [14]

в общем резюме такое:
всему коду сделать Ctrl+A + Shift Del


 
Leonid Troyanovsky ©   (2009-09-23 13:56) [15]


> Игорь ©   (23.09.09 13:48) [12]

> Но я не передаю Strings ни параметрах

or dynamic arrays
Shared-memory manager, RTFM.

--
Regards, LVT.


 
Игорь ©   (2009-09-23 13:56) [16]

Пойду почитаю что нибудь в разделе для начинающих что бы не позориться...


 
Sapersky   (2009-09-23 15:07) [17]

1) Указатель (PMyRecord) не нужен, можно использовать переменную с Var.
2) Если не используется ShareMem - освобождать память должен тот, кто её выделил (DLL, приложение).
3) С дин. массивом ShareMem необязателен - при условии (2) и если не копировать полученный массив (или ещё как-то дёргать счётчик ссылок) в основной программе. Т.е. получили данные - отобразили - вызвали ф-ю освобождения из DLL. Для новичка, наверное, проще использовать ShareMem, чем помнить о всех условиях, тем более если в перспективе будут использоваться строки (изменяющей счётчик "компиляторной магии" у строк гораздо больше).



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

Форум: "Основная";
Текущий архив: 2011.05.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.003 c
8-1211946269
miox
2008-05-28 07:44
2011.05.08
TOleGraphic изменяет оригинальный размер GIFa?


15-1296121492
Джек
2011-01-27 12:44
2011.05.08
Сайты


2-1296638668
Godod
2011-02-02 12:24
2011.05.08
Ошибка access violation at adress


3-1258364954
DelphiN!
2009-11-16 12:49
2011.05.08
Проверка корректности даты в TSQL


2-1296806882
Alex_C
2011-02-04 11:08
2011.05.08
Как jpg показать на Canvas





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