powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не получить корректный Record по указателю из С++ DLL
22 сообщений из 47, страница 2 из 2
Не получить корректный Record по указателю из С++ DLL
    #40035947
Barmaley57
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alekcvp
_Vasilisk_
Смотри на первые три поля. В сумме 4 байта и все само пакуется

А ты вообще понимаешь что такое выравнивание?
Если ты эту структуру в Delphi опишешь, то у тебя будет так:

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
type
_SECURITY_DESCRIPTOR = record
    Revision: Byte;
    { Padding: array [0..6] of Byte; }
    Sbz1: Byte
    { Padding: array [0..6] of Byte; }
    ....
  end;

То что закомментировано добавит компилятор.
Ну не. Скорее уж так
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
type
_SECURITY_DESCRIPTOR = record
    Revision: Byte;
    Sbz1: Byte
    { Padding: array [0..1] of Byte; }
    i:integer;
    ....
  end;
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40035948
alekcvp
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так:

Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где
не надо.

Да, реально, я почему-то думал что он каждое поле будет выравнивать.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40035999
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так:

Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где
не надо.
Не, ты что реально что ли настолько тупой?
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036000
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я реально портировал более чем достаточно структур с Си на Дельфи чтобы знать о чём говорю.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036003
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
И поэтому ты видимо считаешь, что только один в теме, а все остальные - тупни?

Я выше уже приводил пример работы с API (а именно с RAS), где для работы со структурой rasconn требуется именно {$ALIGN 4}, а для всех остальных структуру требуется {$ALIGN 8}.
Хотя о чем это я, гуру ведь говорит иначе!)
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036074
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
И поэтому ты видимо считаешь, что только один в теме, а все остальные - тупни?

Я выше уже приводил пример работы с API (а именно с RAS), где для работы со структурой rasconn требуется именно {$ALIGN 4}, а для всех остальных структуру требуется {$ALIGN 8}.
Хотя о чем это я, гуру ведь говорит иначе!)
А для каких остальных нужно 8? В ras.h действительно стоит #pragma pack(4) вначале файла, и больше я там не нашел переключений выравнивания.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036079
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
_Vasilisk_
Ничего подобного. В WinApi структуры упакованы сами по себе. Там все поля либо четырехбайтовые, либо появляются всякие reserved.
Не, на самом деле в заголовках windows sdk довольно много #pragma pack раскидано, часто парами типа #pragma pack(push,1) / #pragma pack(pop). Плюс еще есть pshpack1.h - pshpack16.h которые много где инклудятся.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036083
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Хотя о чем это я, /гуру/ ведь говорит иначе!)

А теперь подыми глаза повыше и перечитай что именно говорит гуру.

Повторяю медленно: при любых непонятках со структурами надо первым делом сравнивать
размеры и смещения каждого их поля. И общий размер структуры тоже если она используется в
массиве.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036101
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
asutp2
И поэтому ты видимо считаешь, что только один в теме, а все остальные - тупни?

Я выше уже приводил пример работы с API (а именно с RAS), где для работы со структурой rasconn требуется именно {$ALIGN 4}, а для всех остальных структуру требуется {$ALIGN 8}.
Хотя о чем это я, гуру ведь говорит иначе!)
А для каких остальных нужно 8? В ras.h действительно стоит #pragma pack(4) вначале файла, и больше я там не нашел переключений выравнивания.
Я использовал например RasConnStatus, RasEapInfo, RasDialParams, RasEntryName, RasEntry, RasDialExtensions, RasStats - они и для x32 и для x64 корректно работают при {$ALIGN 8}

Dimitry Sibiryakov

asutp2Хотя о чем это я, /гуру/ ведь говорит иначе!)

А теперь подыми глаза повыше и перечитай что именно говорит гуру.

Повторяю медленно: при любых непонятках со структурами надо первым делом сравнивать
размеры и смещения каждого их поля. И общий размер структуры тоже если она используется в
массиве.
ок, смотрим выше твое же сообщение
Dimitry Sibiryakov

alekcvpЕсли ты эту структуру в Delphi опишешь, то у тебя будет так:

Нет, так будет только у asutp2 и ему подобных, которые употребляют опции выравнивания где
не надо.
Так ты уже определись наконец, что делать ПОСЛЕ того, как определены расхождения?
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036114
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Так ты уже определись наконец, что делать ПОСЛЕ того, как определены расхождения?

ПОСЛЕ - аккуратно применять опции выравнивания если они нужны.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036116
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Я использовал например RasConnStatus, RasEapInfo, RasDialParams, RasEntryName, RasEntry, RasDialExtensions, RasStats - они и для x32 и для x64 корректно работают при {$ALIGN 8}
"корректно работают при {$ALIGN 8}" и "требуется {$ALIGN 8}" это немножко разное. Вполне может быть, что работают. А RASCONN на WIN64 и правда сломается.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036117
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov

Повторяю медленно: при любых непонятках со структурами надо первым делом сравнивать
размеры и смещения каждого их поля. И общий размер структуры тоже если она используется в
массиве.
Можно конечно и так, но обычно проще в исходник посмотреть. Правда, иногда (но не в случае winapi) надо еще и знать, с какими параметрами проект на С собирается.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036119
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Бывают конечно казусы. Например, в какой-то старой версии delphi TGUID был описан как packed record. Вот тогда в одном месте пришлось действительно проверять смещение каждого поля. Кода исправили, не знаю, но сейчас в 10.2 packed для TGUID уже нет. И выравнивается он теперь как положено - на 4.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036124
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barloneобычно проще в исходник посмотреть.

....а там в объявлении макросы на typedef-ы и пока дойдёшь до настоящего типа, состаришься.
Проще тестовую программку на экран размером сляпать.

А уж если кто-то применил тип long, так вообще начинается самая забава...
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036127
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
asutp2
Я использовал например RasConnStatus, RasEapInfo, RasDialParams, RasEntryName, RasEntry, RasDialExtensions, RasStats - они и для x32 и для x64 корректно работают при {$ALIGN 8}
"корректно работают при {$ALIGN 8}" и "требуется {$ALIGN 8}" это немножко разное. Вполне может быть, что работают. А RASCONN на WIN64 и правда сломается.
Эмба рекомендует использовать {$ALIGN 8}, поэтому такое выравнивание и используется. SizeOf(структура) и требуемый размер совпадают, вызовы функций работают корректно. Для rasconn используется {$ALIGN 4}, ситуация аналогична.

Dimitry Sibiryakov

asutp2Так ты уже определись наконец, что делать ПОСЛЕ того, как определены расхождения?

ПОСЛЕ - аккуратно применять опции выравнивания если они нужны.
в данной конкретной ситуации нужны и поэтому используются. Продолжить мысль?
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036130
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2Лично у меня в проектах для виндов по умолчанию именно $ALIGN 8, а не 4, для macos - $ALIGN 16

asutp2в данной конкретной ситуации нужны и поэтому используются.

Продолжайте мысль.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036195
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
asutp2
Эмба рекомендует использовать {$ALIGN 8}, поэтому такое выравнивание и используется.
Вот тут неправильно. Она конечно рекомендует, но это относится к случаям, когда вы не взаимодействуете с чужим кодом или сами устанавливаете правила этого взаимодействия. А когда у вас есть готовый чужой код, который вы не можете менять, ALIGN должен соответствовать тому, что есть в этом коде. Для структур, передающихся в этот код, естественно. Для остальных можно следовать рекомендациям.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036212
asutp2
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
asutp2
Эмба рекомендует использовать {$ALIGN 8}, поэтому такое выравнивание и используется.
Вот тут неправильно. Она конечно рекомендует, но это относится к случаям, когда вы не взаимодействуете с чужим кодом или сами устанавливаете правила этого взаимодействия. А когда у вас есть готовый чужой код, который вы не можете менять, ALIGN должен соответствовать тому, что есть в этом коде. Для структур, передающихся в этот код, естественно. Для остальных можно следовать рекомендациям.
Всё правильно, согласен. В моем конкретном случае структуры в RAS работают именно с ALIGN8 (кроме одной), поэтому во всем коде, включая описание этих самых структур, рекомендуемый алижн и используется.

Dimitry Sibiryakov

asutp2Лично у меня в проектах для виндов по умолчанию именно $ALIGN 8, а не 4, для macos - $ALIGN 16

asutp2в данной конкретной ситуации нужны и поэтому используются.

Продолжайте мысль.
Я вообще не улавливаю смысла претензии. Поясните.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036224
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone
Например, в какой-то старой версии delphi TGUID был описан как packed record. Вот тогда в одном месте пришлось действительно проверять смещение каждого поля. Кода исправили, не знаю, но сейчас в 10.2 packed для TGUID уже нет. И выравнивается он теперь как положено - на 4.

Кровавые подробности? Так-то полям TGUID выравнивание не требуется. (у поля D3 смещение - 6, например).
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036231
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Barlone
Например, в какой-то старой версии delphi TGUID был описан как packed record. Вот тогда в одном месте пришлось действительно проверять смещение каждого поля. Кода исправили, не знаю, но сейчас в 10.2 packed для TGUID уже нет. И выравнивается он теперь как положено - на 4.

Кровавые подробности? Так-то полям TGUID выравнивание не требуется. (у поля D3 смещение - 6, например).

На С есть
Код: plaintext
1.
2.
3.
4.
struct {
short a;
GUID b;
...

И тут у нас 2 байта паддинга между a и b.
Транслируем на паскаль, и b прилепляется к a, несмотря на {$ALIGN 4}, потому что у packed record собственное выравнивание 1.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036233
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

Но packed оно о внутренней компоновке полей записи, а не о самой записи в составе другого типа.
...
Рейтинг: 0 / 0
Не получить корректный Record по указателю из С++ DLL
    #40036238
Kazantsev Alexey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Kazantsev Alexey
Но packed оно о внутренней компоновке полей записи, а не о самой записи в составе другого типа.

Проверил. И правда влияет...
...
Рейтинг: 0 / 0
22 сообщений из 47, страница 2 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / Не получить корректный Record по указателю из С++ DLL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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