【问题标题】:How to pass RECT in COM如何在 COM 中传递 RECT
【发布时间】:2013-05-08 03:33:39
【问题描述】:

我需要从 COM 获取一个 64 位的 RECT 到 C#,所以我在 IDL 中定义了一个简单的方法为:

[id(23), helpstring("method GetRect")] HRESULT GetRect([out,retval] RECT* pRect);

并在 C++ 中实现为

STDMETHODIMP CSpot::GetRect(RECT* pRect)
{
CRect rec = get_position(); 
*pRect = rec;
return S_OK;
}

我在 C# 中调用如下:

tagRECT rec = pSpot.GetRect();

大部分时间都可以,但有时我会得到 0xC0000005:访问冲突写入位置 0x0000000000000000。

排队:

*pRect = rec;

什么会导致这个异常?

【问题讨论】:

  • 如果方法定义为GetRect(RECT* pRect),如何使用tagRECT rec = pSpot.GetRect();?你不应该使用pSpot.GetRect(rec)吗?
  • @fogbit - 不,这里的一切都是正确的。高级 COM 包装器(包括 RCW)经常检查 HRESULT 返回以针对非S_OK 结果生成异常。标记为[retval] 的参数成为此类包装方法的返回值。这里的实际问题是包装器sometimes 将零指针传递给COM 方法,这会导致异常。我个人对RCW知之甚少,所以我不能说为什么会发生这种事情。
  • 在 COM 接口上,我总是会检查指针并在 NULL 值上返回 E_POINTER。此外,如果 NULL 值违反合同,我会在 COM 服务器中添加调试输出。

标签: c# c++ com


【解决方案1】:

不确定这是否是您的问题,但是当使用 COM 方法中的 RECT 时,我需要按如下方式“定义”RECT 对象:

[StructLayout(LayoutKind.Sequential, Pack = 0)]
public struct RECT
{
    public int left;
    public int top;
    public int right;
    public int bottom;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-13
    • 1970-01-01
    • 1970-01-01
    • 2016-06-26
    • 1970-01-01
    • 2017-12-10
    • 1970-01-01
    • 2010-09-22
    相关资源
    最近更新 更多