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

Как правильно объявить такую структуру через динамический массив?
Код: 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
Указатель на массив С++ => Delphi
    #39880582
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp,

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

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


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



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

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

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

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

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

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

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

И вот это-то условие в твоём случае и не соблюдается.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880597
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Указатель на массив С++ => Delphi
    #39880600
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpРазве выделенная часть не означает, что память выделяет приложение *до* вызова метода?..

Да. А предложение сразу после неё означает, что переменная получает указатель на память,
выделенную где-то внутри.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880601
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Указатель на массив С++ => Delphi
    #39880605
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
такая идея:

Код: 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
Указатель на массив С++ => Delphi
    #39880607
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКак я понимаю, он копирует адреса объектов в ячейки предоставленного массива, а не
подменяет его своим.

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

Код: 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
Указатель на массив С++ => Delphi
    #39880612
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я не выделяю память под массив
я просто пермещаю указатель (pArr) на начало какого-то блока в памяти и работаю с этим блоком как будто там массив из не более 10000 элементов
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880659
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кроик Семёня не выделяю память под массив
я просто пермещаю указатель (pArr) на начало какого-то блока в памяти и работаю с этим блоком как будто там массив из не более 10000 элементов
Ну память-то под этот блок всё равно где-то надо будет выделять. А проще SetLength() только статический массив, но его большим не сделаешь.
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880662
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpkealon(Ruslan) Кроме того, в поставке дельфи есть автоматический импортёр библиотек типов. idl-ку из которой вы это взяли компилите в tbl-ку, а с неё уже импортируетеЯ это взял из docs.microsoft.com, как и откуда импортировать я не знаю :(
На C++ это всё описано в стандартных заголовочных файлах, которые отдельно даже в гугле хрен найдёшь.ставите SDK от микрософта (можно установить вместе со студией)

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


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

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

kealon(Ruslan)ставите SDK от микрософта (можно установить вместе со студией)
idl-ки будут здесь:
Код: plaintext
Program Files (x86)\Microsoft SDKs\Windows\{ver}\Include\
вообще целый класс таких интерфейсов есть в Winapi.ActiveX, см например IEnumUnknownСпасибо, попробую. А чем их в TLB конвертить?..
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880727
kealon(Ruslan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Указатель на массив С++ => Delphi
    #39880731
Фотография Кроик Семён
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvpКроик Семёня не выделяю память под массив
я просто пермещаю указатель (pArr) на начало какого-то блока в памяти и работаю с этим блоком как будто там массив из не более 10000 элементов
Ну память-то под этот блок всё равно где-то надо будет выделять. А проще SetLength() только статический массив, но его большим не сделаешь.

Я почти на 100% уверен, что библиотека имеет функции для выделения памяти под буфер и под его освобождение
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880789
Василий 2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И чего вы мудрите, массивы они и в Африке массивы.
Если задача в объявлении, то либо pointer to pointer to IUnknown (и элементы извлекать через Inc), как в оригинале, либо pointer to array[0..maxint] of IUnknown.
Если задача в вызове, то любой Delphi массив прокатит.
...
Рейтинг: 0 / 0
Указатель на массив С++ => Delphi
    #39880866
Фотография _Vasilisk_
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что вы извращаетесь?
Код: 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
Указатель на массив С++ => Delphi
    #39880979
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Короче подумал и, в итоге, сделал
Код: pascal
1.
ppObjectArray: PIUnknown;

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


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