我是 COM 新手。我的任务是用新功能扩展现有的 COM 服务器。扩展或重写现有方法可以正常工作,但是,我添加了一个返回数字的新方法,但是在将简单值写入指针位置时出现异常(0xC0000005:访问冲突写入位置...),甚至很难编写代码与现有方法完全相同。新方法被执行,因为其中的断点正在工作。我究竟做错了什么?似乎服务器存根没有为新方法分配内存。用于测试服务器方法的客户端是用 C# 编写的。服务器和测试客户端在同一台机器上执行。
.idl 文件:
[id(19)] HRESULT GetLoggingLevel
(
[out, retval] long* Level
);
[id(190)] HRESULT GetLoggingLevelNew
(
[out, retval] long* Level
);
COM 服务器的 .cpp 文件:
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
...