Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Указатель на массив С++ => Delphi / 25 сообщений из 32, страница 1 из 2
23.10.2019, 16:39
    #39880565
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Добрый день.

Как правильно объявить такую структуру через динамический массив?
Код: plaintext
1.
2.
3.
4.
5.
6.
 [helpstring("method Next")] HRESULT Next(
   [in] unsigned long celt,
   [out, size_is(celt), length_is(*pcFetched)] 
     IUnknown** ppObjectArray,
   [out] unsigned long* pcFetched
 );

ppObjectArray : A pointer to an array of IUnknown interfaces. The size of this array MUST be equal to celt. If successfully completed, it receives an array of the IUnknown interfaces of the next objects in the enumeration; the number of elements in this array MUST be equal in size to the value of pcFetched. Callers MUST release each IUnknown interface that is received.
Варианты:
Код: pascal
1.
2.
a) ...; ppObjectArray: array of IUnknown; ...
b) ...; var ppObjectArray: array of IUnknown; ... 


Т.к. динамический массив же сам вроде указатель? А здесь, как я понимаю, функция память не выделяет, а просто заполняет массив значениями.
...
Рейтинг: 0 / 0
23.10.2019, 16:54
    #39880582
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvp,

ни "a", ни "b" неправильны - открытые массивы это дельфи-specific
А этот интерфейс и так описан - стандартный перечислитель для объектов автоматизации

alekcvpпросто заполняет предоставленный массив значениямиабсолютно точно
можно записать абсолютно равноценно, вот так
Код: pascal
1.
const ppObjectArray: ^IUnknown


или так
Код: pascal
1.
var ppObjectArray: IUnknown



Кроме того, в поставке дельфи есть автоматический импортёр библиотек типов. idl-ку из которой вы это взяли компилите в tbl-ку, а с неё уже импортируете
...
Рейтинг: 0 / 0
23.10.2019, 17:00
    #39880586
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
kealon(Ruslan)alekcvp,
А этот интерфейс и так описан - стандартный перечислитель для объектов автоматизации
А как он называется и в каком модуле?

kealon(Ruslan)alekcvpпросто заполняет предоставленный массив значениямиабсолютно точно
можно записать абсолютно равноценно, вот так
Код: pascal
1.
var ppObjectArray: IUnknown

И как потом перечислять элементы?..

kealon(Ruslan) Кроме того, в поставке дельфи есть автоматический импортёр библиотек типов. idl-ку из которой вы это взяли компилите в tbl-ку, а с неё уже импортируетеЯ это взял из docs.microsoft.com, как и откуда импортировать я не знаю :(
На C++ это всё описано в стандартных заголовочных файлах, которые отдельно даже в гугле хрен найдёшь.
...
Рейтинг: 0 / 0
23.10.2019, 17:01
    #39880587
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpКак правильно объявить такую структуру через динамический массив?

Никак, обломись.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2019, 17:02
    #39880588
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
kealon(Ruslan)пропущено...
абсолютно точно
можно записать абсолютно равноценно, вот так
Код: pascal
1.
var ppObjectArray: IUnknown

А самое главное - как в такой записи предварительно выделить память для, например, 10 элементов?..
...
Рейтинг: 0 / 0
23.10.2019, 17:04
    #39880590
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Dimitry SibiryakovalekcvpКак правильно объявить такую структуру через динамический массив?

Никак, обломись.
Почему нет-то? Динамический массив же - это, по-факту, указатель на обычный массив в памяти, а вся "магия компилятора" спрятана в нём по отрицательным смещениям и не видна, при условии что память выделяется и освобождается в Delphi.
...
Рейтинг: 0 / 0
23.10.2019, 17:12
    #39880593
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpпри условии что память выделяется и освобождается в Delphi.

И вот это-то условие в твоём случае и не соблюдается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2019, 17:15
    #39880597
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Dimitry Sibiryakovalekcvpпри условии что память выделяется и освобождается в Delphi.

И вот это-то условие в твоём случае и не соблюдается.

Ммм?
ppObjectArray: A pointer to an array of IUnknown interfaces. The size of this array MUST be equal to celt. If successfully completed, it receives an array of the IUnknown interfaces of the next objects in the enumeration; the number of elements in this array MUST be equal in size to the value of pcFetched. Callers MUST release each IUnknown interface that is received.Разве выделенная часть не означает, что память выделяет приложение до вызова метода?..
...
Рейтинг: 0 / 0
23.10.2019, 17:22
    #39880600
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpРазве выделенная часть не означает, что память выделяет приложение *до* вызова метода?..

Да. А предложение сразу после неё означает, что переменная получает указатель на память,
выделенную где-то внутри.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2019, 17:25
    #39880601
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Dimitry SibiryakovДа. А предложение сразу после неё означает, что переменная получает указатель на память,
выделенную где-то внутри.

https://docs.microsoft.com/en-us/openspecs/windows_protocols/ms-vds/8e48f231-3fb6-4f15-ace6-a0ba244cb5f1 The server MUST perform the following:

If the number of objects from the current index to the end of the enumeration is greater than or equal to the number of objects being requested in celt:

Populate the IUnknown pointers in ppObjectArray with the next IUnknown pointers (the amount of which celt specifies) in the enumeration that is starting from the current index.
Как я понимаю, он копирует адреса объектов в ячейки предоставленного массива, а не подменяет его своим.
...
Рейтинг: 0 / 0
23.10.2019, 17:29
    #39880605
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
такая идея:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
const
   MAX_POSSIBLE_INTERFACES_ARR_INDEX  = 10000; //число фантазируем 
type
   TInterfacesArray = {packed} array [0..MAX_POSSIBLE_INTERFACES_ARR_INDEX] of IUnknown;
   PInterfacesArray = ^TInterfacesArray;

var
   pArr: PInterfacesArray;
begin
   ...
   ...
   pArr:=@ObjectArray;

   //доступ как к элементам массива
   p^[0]
   p^[1]
   p^[2]
   p^[3]
...
Рейтинг: 0 / 0
23.10.2019, 17:31
    #39880607
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpКак я понимаю, он копирует адреса объектов в ячейки предоставленного массива, а не
подменяет его своим.

Ну, если так, то первый вариант должен сработать по идее. Возьми и проверь. Но будет
засада с compiler magic и счётчиком ссылок.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
23.10.2019, 17:36
    #39880609
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
а так, разве параметр с массивом не типа PSafeArray должен быть?
тогда мой код из примера на помойку
...
Рейтинг: 0 / 0
23.10.2019, 17:36
    #39880610
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Кроик Семёнтакая идея:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
const
   MAX_POSSIBLE_INTERFACES_ARR_INDEX  = 10000; //число фантазируем 
type
   TInterfacesArray = {packed} array [0..MAX_POSSIBLE_INTERFACES_ARR_INDEX] of IUnknown;
   PInterfacesArray = ^TInterfacesArray;

var
   pArr: PInterfacesArray;
begin
   ...
   ...
   pArr:=@ObjectArray;

   //доступ как к элементам массива
   p^[0]
   p^[1]
   p^[2]
   p^[3]


А разве это pArr не то же самое [для вызова функции] что и ниже?
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
const
   MAX_POSSIBLE_INTERFACES_ARR_INDEX  = 10000; //число фантазируем 

var
   pArr: array of IUnknown ;
begin
   SetLength(pArr, MAX_POSSIBLE_INTERFACES_ARR_INDEX);
   pArr[0]
   pArr[1]
   pArr[2]
   pArr[3]
...
Рейтинг: 0 / 0
23.10.2019, 17:41
    #39880612
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
я не выделяю память под массив
я просто пермещаю указатель (pArr) на начало какого-то блока в памяти и работаю с этим блоком как будто там массив из не более 10000 элементов
...
Рейтинг: 0 / 0
23.10.2019, 19:29
    #39880659
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Кроик Семёня не выделяю память под массив
я просто пермещаю указатель (pArr) на начало какого-то блока в памяти и работаю с этим блоком как будто там массив из не более 10000 элементов
Ну память-то под этот блок всё равно где-то надо будет выделять. А проще SetLength() только статический массив, но его большим не сделаешь.
...
Рейтинг: 0 / 0
23.10.2019, 19:37
    #39880662
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpkealon(Ruslan) Кроме того, в поставке дельфи есть автоматический импортёр библиотек типов. idl-ку из которой вы это взяли компилите в tbl-ку, а с неё уже импортируетеЯ это взял из docs.microsoft.com, как и откуда импортировать я не знаю :(
На C++ это всё описано в стандартных заголовочных файлах, которые отдельно даже в гугле хрен найдёшь.ставите SDK от микрософта (можно установить вместе со студией)

idl-ки будут здесь:
Код: plaintext
Program Files (x86)\Microsoft SDKs\Windows\{ver}\Include\


вообще целый класс таких интерфейсов есть в Winapi.ActiveX, см например IEnumUnknown
...
Рейтинг: 0 / 0
23.10.2019, 19:40
    #39880664
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvp,

и совет: прежде, чем интерфейс пытаться самому достать проходиться поиском по исходникам в дельфи
...
Рейтинг: 0 / 0
23.10.2019, 21:57
    #39880704
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
kealon(Ruslan)alekcvp,
и совет: прежде, чем интерфейс пытаться самому достать проходиться поиском по исходникам в дельфиСпасибо, кэп. 'IEnumVdsObject' не находит ничего (в моей версии по крайней мере).

kealon(Ruslan)ставите SDK от микрософта (можно установить вместе со студией)
idl-ки будут здесь:
Код: plaintext
Program Files (x86)\Microsoft SDKs\Windows\{ver}\Include\
вообще целый класс таких интерфейсов есть в Winapi.ActiveX, см например IEnumUnknownСпасибо, попробую. А чем их в TLB конвертить?..
...
Рейтинг: 0 / 0
24.10.2019, 00:08
    #39880727
kealon(Ruslan)
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpkealon(Ruslan)ставите SDK от микрософта (можно установить вместе со студией)
idl-ки будут здесь:
Код: plaintext
Program Files (x86)\Microsoft SDKs\Windows\{ver}\Include\
вообще целый класс таких интерфейсов есть в Winapi.ActiveX, см например IEnumUnknownСпасибо, попробую. А чем их в TLB конвертить?..
в SDK или студию входит тулза, как-то так

Код: plaintext
"midl.exe" /env win32 <fn>.idl /tlb <fn>.tlb
...
Рейтинг: 0 / 0
24.10.2019, 00:38
    #39880731
Кроик Семён
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
alekcvpКроик Семёня не выделяю память под массив
я просто пермещаю указатель (pArr) на начало какого-то блока в памяти и работаю с этим блоком как будто там массив из не более 10000 элементов
Ну память-то под этот блок всё равно где-то надо будет выделять. А проще SetLength() только статический массив, но его большим не сделаешь.

Я почти на 100% уверен, что библиотека имеет функции для выделения памяти под буфер и под его освобождение
...
Рейтинг: 0 / 0
24.10.2019, 10:33
    #39880789
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
И чего вы мудрите, массивы они и в Африке массивы.
Если задача в объявлении, то либо pointer to pointer to IUnknown (и элементы извлекать через Inc), как в оригинале, либо pointer to array[0..maxint] of IUnknown.
Если задача в вызове, то любой Delphi массив прокатит.
...
Рейтинг: 0 / 0
24.10.2019, 12:14
    #39880866
_Vasilisk_
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Что вы извращаетесь?
Код: pascal
1.
2.
3.
4.
type
  TObjectArray = array of IUnknown;  // объявление нового типа обязательно

function Next(celt: Cardinal; const ppObjectArray: TObjectArray; out pcFetched: Cardinal): HRESULT;


или
Код: pascal
1.
function Next(celt: Cardinal; const ppObjectArray: TArray<IUnknown>; out pcFetched: Cardinal): HRESULT;
...
Рейтинг: 0 / 0
24.10.2019, 14:27
    #39880979
alekcvp
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Короче подумал и, в итоге, сделал
Код: pascal
1.
ppObjectArray: PIUnknown;

потому что так универсальнее - можно и любой массив передавать и единичный интерфейс, при необходимости.
...
Рейтинг: 0 / 0
24.10.2019, 14:50
    #39880999
Василий 2
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Указатель на массив С++ => Delphi
Тоже довод.
А можно и перегрузить для пущего сахару.
...
Рейтинг: 0 / 0
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Указатель на массив С++ => Delphi / 25 сообщений из 32, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]