Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Передача структур через OleVariant


Автор: VictorPr 1.7.2004, 17:28
День добрый. Вопрос такой. Каким образом, в Делфи возможно передать клиенту из метода COM некую структуру, используя OleVariant в качестве out параметра?
Заранее спасибо.

Автор: <Spawn> 1.7.2004, 19:59
А зачем передавать через OleVariant? Можешь попробовать набросать интерфейс за место структуры и передавать указатель на его экземпляр. Недавно что то похожее в книге видел.

Автор: VictorPr 2.7.2004, 08:36
Почемуто все ссылаются на книги biggrin.gif Дело в том, ято этого требует клиентская программа. Ей нада получить именно вариант.

Автор: Girder 2.7.2004, 09:33
Напиши как и чего ты хочеш в виде кода. Так тебе быстрее помогут.

Автор: VictorPr 2.7.2004, 11:57
Да тут дело оказалось проще, можно структуры и так гонять, нада только описать их в TLB
А вот возникла другая трабла. Как передать вложенные структуры? Например:
TFileInfo = packed record
m_Name: WideString;
m_Size: Integer;
m_AllocSize: Integer;
m_Creation: WideString;
m_Change: WideString;
m_LastAccess: WideString;
m_LastWrite: WideString;
end;

TDir_Entry = packed record
m_Size: Integer;
m_Files: ^TFileInfo;
end;
Дело в том, что изменить этот код я не могу, он всё равно перегенерится делфёй. Я программер С++ и понять не могу как в паскале сделать следующее, вторая структура содержит указатель на первую, потому как в TLB прописанно:
typedef struct tagTDir_Entry
{
long m_Size;
struct tag TFileInfo * m_Files /*Warning: unable to validate structure name: */;
int TDir_Entry_DUMMY;
} TDir_Entry;
Вот, но мне нада этот указатель сделать динамическим массивом. Пример как это в С++ делается:
TFileInfo * m_Files = new TFileInfo[10].

Как такое сделать в паскале?

Автор: <Spawn> 2.7.2004, 12:20
Код
PFileInfo = ^TFileInfo;
TFileInfo = packed record
m_Name: WideString;
m_Size: Integer;
m_AllocSize: Integer;
m_Creation: WideString;
m_Change: WideString;
m_LastAccess: WideString;
m_LastWrite: WideString;
end;

TDir_Entry = packed record
m_Size: Integer;
m_Files: array of PFileInfo;
end;

Добавлено @ 12:22
Задавать размер так
Код
SetLength(DirEntry.m_Files, 10);
for i := 0 to 9 do
 GetMem(DirEntry.m_files[i], SizeOf(TFileInfo));

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)