0

我是 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
    ...
4

1 回答 1

1

如果你改变了一个 COM 接口,你必须给它分配一个新的 GUID。不这样做可能会导致您的接口使用了错误的代理/存根,这可能不会影响您的新方法......

于 2013-11-05T10:05:46.653 回答