Sergei I. Gorelkin писал(а):и под каждый аргумент отводилось sizeof(pointer) байт
Как интересно. Я-то считал, что под него выделяется как минимум sizeof(pointer) из соображений выравнивания. Соответственно, для i386 проверял, а не надо ли сдвинуть сильнее... Сейчас получается, что надо менять обработку и для x64, поскольку под Integer или Boolean выделяется 4 байта и на x64 тоже. И у меня нет уверенности, что это правильно, и мы не столкнемся с проблемами выравнивания где-нибудь на экзотической платформе.
Sergei I. Gorelkin писал(а):Из-за этого в патч для DispInvoke придется вносить изменения
Посмотрю.
Sergei I. Gorelkin писал(а):Просто так подставлять varOleStr вместо varUnicodeString нельзя, это разные типы, нужно выделять память с помощью SysAllocateString и копировать строку туда, но это возможно только для windows...
А вот не уверен. Во-первых, лишнее выделение строки, в общем-то, ни к чему. Во-вторых, тут главное не поломать совместимость с OLE и Delphi, а для других случаев может передаваться все, что угодно. Пусть об этом программист, который будет разбирать результат, заботится.
Добавлено спустя 3 минуты 21 секунду:
И, кстати, о Delphi... Есть еще именованные параметры. Насколько я понимаю, пока в FPC на них положен большой болт... Не то, чтобы они были мне нужны, но вот для совместимости таки требуются.
Добавлено спустя 1 час 48 минут 56 секунд:
Посмотрел изменения в ComObj. В общем, не проблема копировать варианты в DispInvoke... Меня больше беспокоит вопрос выравнивания. Было бы здорово, если б кто посмотрел, как это работает в Delphi 64... Хотя и это не совсем аргумент, поскольку та все равно не рассчитана на платформы, кроме x86, а в них можно данные и по байту выравнивать, а в более общем случае — не получится.
Добавлено спустя 7 минут 38 секунд:
Насчет строк тут у меня такое соображение возникло:
Если строка передается как значение, то вопросы выделения памяти поднимать не стоит — по правилам хорошего тона вызываемая сторона не должна ничего с ней делать (хотя для OLE это и не так, но тут в чистом виде проблемы OLE — так делать нельзя, получили кучу геморроя и, несмотря на все старания, источник трудноуловимых ошибок). А вот если по ссылке... Тогда никакое копирование не подходит, ибо надо изменения вернуть в строку-параметр...
В общем, сильно заморачиваться на них не стоит.