我有一个用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#代码中进行更改。