如何解决:运行时封送程序无法封送“”的至少一个参数

时间:2019-07-12 17:04:43

标签: c# c++ com activex marshalling

我有一个用C ++编写的COM对象和一个使用此ActiveX控件的C#应用​​程序。 C ++代码可以正常编译,没有任何警告。 C#应用程序正在生成一些警告,如标题中所示。

我看到所有COM函数都具有相似的签名,它们都期望使用int**输入参数。
我认为这是问题所在。使用Google,我也发现了一些建议。我还发现有帖子说我可以忽略这些警告。但是因为我也可以访问C ++代码,所以我想解决它。

这是我的身份证号码:

[id(34), helpstring("method DrawRectangle")] HRESULT DrawRectangle([in]int** hdc, [in]float x, [in]float y, [in]int width, [in]int height, [out, retval] VARIANT_BOOL* retVal);

这是C ++函数:

STDMETHODIMP CShapeDrawingOptions::DrawRectangle(int** hdc, float x, float y, int width, int height, VARIANT_BOOL* retVal)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState())
    const auto dc = CDC::FromHandle(reinterpret_cast<HDC>(hdc));

    *retVal = this->DrawRectangleCore(dc, x, y, width, height);
    return S_OK;
}

这就是我在C#中的称呼方式:

using(var bmp = new Bitmap(width, height, PixelFormat.Format32bppArgb))
using (var g = Graphics.FromImage(bmp))
{
    IntPtr hdc = g.GetHdc();
    var retVal = shapeDrawingOptions.DrawRectangle(hdc, 40.0f, 40.0f, width - 80, height - 80);
    g.ReleaseHdc(hdc);
    bmp.Save(filename, ImageFormat.Png);
}

GetHdc返回一个IntPtr,该IntPtr被发送到COM函数,应将其编组到int**

一切正常。我只想摆脱编译器警告。 ActiveX控件已分发,其他开发人员也收到了这些警告,这很草率。
我可以在C ++和/或C#代码中进行更改。

0 个答案:

没有答案