Я обнаружил, что когда я добавляю новые события в существующий интерфейс COM/IDL, я иногда сталкиваюсь с непонятными проблемами, если они не добавлены в конец интерфейса.Зачем нужно добавлять новые события в * конец * интерфейса 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, смещениями адресов или чем-то подобным. Или, может быть, это потому, что я не перестроил что-то должным образом, и добавление его до конца позволяет ему работать по чистой удаче.
Может ли кто-нибудь объяснить это поведение?
Извините, я должен был четко понять свой первоначальный вопрос. Все клиенты моего COM-интерфейса находятся под контролем меня, поэтому я могу перестроить их против изменений. Нет клиентов (насколько мне известно), которые я не могу перекомпилировать. Это COM-интерфейс, который используется внутри различных компонентов программного обеспечения, над которым я работаю. – LeopardSkinPillBoxHat
Я предполагаю, что у вас есть бинарный клиент или сервер, который не был должным образом обновлен или зарегистрирован. Я бы предложил сделать чистую сборку и проверку на чистой машине. – sterin
Даже если вы контролируете весь код, следуя правилу добавления в конец файла, можно резко уменьшить количество боли, которое вы понесете, забыв перекомпилировать. Это хорошая практика и очень легко следовать. – sharptooth