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