Я работаю со сторонним COM-сервером с его собственным пользовательским интерфейсом, который устанавливает и получает структуры как некоторые из своих свойств. Так получилось, что я использую C++ для клиента. Я опубликовал некоторый репрезентативный код из файла IDL ниже с измененными именами и удаленными идентификаторами GUID.
Определена ли упаковка структуры или это просто удача, что мой клиентский код использует те же настройки упаковки, с которыми был построен COM-сервер? Может ли это пойти не так в проектах, где параметры упаковки компилятора C++ по умолчанию были изменены? Есть ли настройка пакета прагмы, которую я мог бы использовать, чтобы убедиться, что настройки упаковки клиентского компилятора верны?
Я не вижу прагм или операторов упаковки ни в IDL, ни в заголовочном файле, сгенерированном из MIDL. Что произойдет, если клиент вместо этого будет использовать C#или VB? Является ли поведение упаковки более четким, если оно вызывается через механизм IDispatch?
struct MyStruct
{
int a, b;
};
[
object,
uuid( /* removed */ ),
dual,
nonextensible,
pointer_default(unique)
]
interface IVideoOutputSettings : IDispatch{
[propget, id(1), HRESULT MyProperty([out, retval] struct MyStruct* pVal);
[propput, id(1), HRESULT MyProperty([in] struct MyStruct newVal);
/* other methods */
};