Я обнаружил, что когда я добавляю новые события в существующий интерфейс COM / IDL, я иногда сталкиваюсь со странными проблемами, если они не добавляются в конец интерфейса.
Например, скажем, у меня есть следующий интерфейс:
interface IMyEvents
{
HRESULT FooCallback(
[in] long MyParam1,
[in] long MyParam2,
[in] long MyParam3);
HRESULT BarCallback(
[in] long MyParam1,
[in] BSTR MyParam2,
[in] BSTR MyParam3);
};
Теперь допустим, я хочу добавить новое событие обратного вызова, NewCallback
. Если я добавлю это следующим образом, у меня не будет никаких проблем, когда событие запускается через COM:
interface IMyEvents
{
HRESULT FooCallback(
[in] long MyParam1,
[in] long MyParam2,
[in] long MyParam3);
HRESULT BarCallback(
[in] long MyParam1,
[in] BSTR MyParam2,
[in] BSTR MyParam3);
/* New event added to the end */
HRESULT NewCallback(
[in] BSTR MyParam1,
[in] BSTR MyParam2,
[in] BSTR MyParam3);
};
Но если я добавлю это следующим образом, я могу столкнуться с различными проблемами (например, переполнением буфера) при возникновении события.
interface IMyEvents
{
HRESULT FooCallback(
[in] long MyParam1,
[in] long MyParam2,
[in] long MyParam3);
/* New event added to the middle */
HRESULT NewCallback(
[in] BSTR MyParam1,
[in] BSTR MyParam2,
[in] BSTR MyParam3);
HRESULT BarCallback(
[in] long MyParam1,
[in] BSTR MyParam2,
[in] BSTR MyParam3);
};
Я предполагаю, что это как-то связано с точками входа DLL, смещением адресов или чем-то подобным. Или, может быть, это из-за того, что я что-то не перестроил должным образом, и добавление его в конец позволяет работать по счастливой случайности.
Может кто-нибудь объяснить это поведение?