C# COM/DCOM:服务器存根不为现有接口中的新方法分配内存

C# COM/DCOM:服务器存根不为现有接口中的新方法分配内存,c#,c++,com,access-violation,dcom,C#,C++,Com,Access Violation,Dcom,我是新来的。我的任务是用新功能扩展现有的COM服务器。扩展或重写现有方法可以正常工作,但是,我添加了一个返回数字的新方法,但在将简单值写入指针位置时出现异常(0xC0000005:访问冲突写入位置…),即使代码与现有方法完全相同。执行新方法时,其中的断点正在工作。我做错了什么?似乎服务器存根没有为新方法分配内存。测试服务器方法的客户机是用C#编写的。服务器和测试客户端在同一台机器上执行 .idl文件: COM服务器的.cpp文件: 表1.cs测试客户端 如果更改COM接口,则必须为其分配新的GU

我是新来的。我的任务是用新功能扩展现有的COM服务器。扩展或重写现有方法可以正常工作,但是,我添加了一个返回数字的新方法,但在将简单值写入指针位置时出现异常(0xC0000005:访问冲突写入位置…),即使代码与现有方法完全相同。执行新方法时,其中的断点正在工作。我做错了什么?似乎服务器存根没有为新方法分配内存。测试服务器方法的客户机是用C#编写的。服务器和测试客户端在同一台机器上执行

.idl文件:

COM服务器的.cpp文件:

表1.cs测试客户端


如果更改COM接口,则必须为其分配新的GUID。如果不这样做,可能会导致接口使用错误的代理/存根,这可能与您的新方法无关…

谢谢,这很有帮助。在那之后,我在客户端得到了E_NOINTERFACE。结果我不得不再次注册我的COM服务器。
[id(19)] HRESULT GetLoggingLevel
(
    [out, retval] long* Level
);
[id(190)] HRESULT GetLoggingLevelNew
(
    [out, retval] long* Level
);
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;
}
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
    ...