Я тут разбираюсь с COM на Assembler под Win32. Возникло два вопроса: 1) Как устроен WideString? Найти в Google не получилось. Всё, что я понял - это не обычный PChar паскаля (только по 2 байта на символ), а какой-то продвинутый. 2) Как устроен Variant? Как мне запихнуть/получить из него число/строку? Как построен PSafeArray Delphi? UPD: Разобрался с WideString. Это обычная null-terminated строка из 16-битных символов. Просто статьи про WideString Delphi меня немного запутали. Второй вопрос по прежнему в силе.
Не совсем, т.к. WideString это дельфийский аналог строки BSTR, используемой в COM\OLE, и соотв-но перед первым символом (по смещению -4) у нее д.б. 4-байтный int, содержащий длину строки в байтах без учета нуль-терминатора, т.е. кол-во символов строки *2. Ну и соотв-но вместо того, чтобы формировать эти строки "вручную" можно юзать виндовые ф-и SysAllocString и т.п. То же самое и с SafeArray - в мсдн есть и описание структуры и куча функций Там же рядышком и ф-ии для работы с Variant отыщешь, а его структуру можно и в дельфийской справке глянуть
Значит программа-клиент (не моя) работает не по стандартам. Потому что когда вначале строки была ещё и длинна выводился один непечатный символ, а когда я убрал длину - нормальная строка. Посмотрю щас Variant то что вы мне дали. В любом случае спасибо.
Длина должна быть не в начале строки, а перед строкой символов (по отрицательному смещению -4 относительно указателя на строку). Поэтому WideString и получается совместимой с обычной null-terminated PWideChar, поскольку указывает не на поле длины, а на первый символ строки
Variant - собственное изобретение Борланда, от версии к версии растёт, крепнет и меняется. Подробности - в папке с исходниками, файл Variants.pas.
С чего это ?! Никакое это не "изобретение", а лишь адаптация стандартного комовского VARIANT "под себя" - и структура и числовая кодировка стандартных VARTYPE те же самые, разница только в названиях полей и их типов. Плюс ес-но добавлена возможность хранения собственных типов AnsiString, дин.массивов и т.д. для "внутреннего" использования. А для "внешнего" есть OleVariant - все то же самое, но с автоконвертацией "внутренних" типов в стандартные BSTR, SafeArray и т.п.