c # — COM / DCOM: серверная заглушка не выделяет память для новых методов в существующем интерфейсе

Я новичок в COM. У меня есть задача расширить существующий COM-сервер новыми функциями. Расширение или перезапись существующих методов работает нормально, однако я добавил новый метод, который возвращает число, но я получаю исключение (0xC0000005: место записи нарушения прав доступа …) при записи простого значения в местоположение указателя, даже если код сложный точно так же, как существующий метод. Новый метод выполняется, так как в нем работают точки останова. Что я делаю неправильно? Кажется, что серверная заглушка не выделяет память для новых методов. Клиент для проверки метода сервера написан на C #. Сервер и тестовый клиент выполняются на одной машине.

.файл idl:

[id(19)] HRESULT GetLoggingLevel
(
[out, retval] long* Level
);
[id(190)] HRESULT GetLoggingLevelNew
(
[out, retval] long* Level
);

.cpp файл COM сервера:

STDMETHODIMP DeviceControl::GetLoggingLevel(LONG * Level)
{
*Level = 43; // works
return S_OK;
}
STDMETHODIMP DeviceControl::GetLoggingLevelNew(LONG * Level)
{
*Level = 42; // acces violation writing location [Level]
return S_OK;
}

Form1.cs тестового клиента

private void Form1_Load(object sender, EventArgs e)
{
m_deviceControl = new MechLib.DeviceControl();
int foo = m_deviceControl.GetLoggingLevel(); // foo = 43
int bar = m_deviceControl.GetLoggingLevelNew(); // server crashes
...

0

Решение

Если вы когда-либо меняете интерфейс COM, вы ДОЛЖНЫ назначить ему новый GUID. Невыполнение этого требования может привести к тому, что для вашего интерфейса будет использован неправильный прокси / заглушка, и это, скорее всего, не повлияет на ваш новый метод …

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]