我是 COM 新手。我的任务是用新功能扩展现有的 COM 服务器。扩展或重写现有方法工作正常,但是,我添加了一个返回数字的新方法,但在向指针位置写入一个简单值时出现异常(0xC0000005:访问冲突写入位置...),即使代码很艰难与现有方法完全相同。新方法被执行,因为其中的断点正在工作。我究竟做错了什么?似乎服务器 stub 没有为新方法分配内存。测试服务器方法的客户端是用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
...
最佳答案
如果您更改了 COM 接口(interface),则必须为其分配一个新的 GUID。如果不这样做,可能会导致错误的代理/ stub 被用于您的接口(interface),这可能不会影响您的新方法......
关于c# - COM/DCOM : Server stub does not allocate memory for new methods in existing interface,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19786071/