我有一个 23x23 位图,我将其从文件加载到 IPictureDisp
COM 接口的实例中。我正在使用OleLoadPicture
,通过加载图片IID_IPictureDisp
。请假设这正在工作并向我返回一个指向 an 的有效指针IPictureDisp
,我可以从中IDispatch
毫无问题地获得一个指针。
我还可以用来IDispatch::Invoke
获取图片的Height
和Width
成员的值,正如预期的那样,它们返回为 23 和 23。
问题是由于某种原因使用IDispatch::Invoke
调用该Render
方法绘制了一个 23x23 单色正方形而不是我期望的图片。此外,单色方块的颜色对应于位图左下像素的颜色(我假设它是位图的第 0 个像素)。
上图是我使用的位图(正常尺寸,放大到原来的 4 倍,这样你就可以看到颜色了)。下面的图像是实际渲染的。
我认为问题可能与我打电话的方式有关IDispatch::Invoke
。
我想做的是(伪代码):
pic.Render(hdc, x, y, w, h, 0, h-1, w, -h, &rc)
哪里rc
是一个RECT
看起来像这样的结构:left => x ; top => y ; right => x + w ; bottom => y + h
.
最终被调用的 C 代码等价于:
// NOTE: x = 0, y = 0, w = 23, h = 23, and -h => 0xffffffe9 in a 32-bit int
DISPPARAMS args = { NULL, NULL, 0, 0 };
args.cArgs = 10;
args.rgvarg = (VARIANT *)alloca(10 * sizeof(VARIANT));
int values[10] = { (int)hdc, x, y, w, h, 0, h-1, w, -h, (int)&rc };
for (int k = 0; k < 10; ++k)
{
V_VT(args.rgvarg[10-k-1]) = VT_I4;
V_I4(args.rgvarg[10-k-1]) = values[k];
}
VARIANT result;
VariantInit(&result);
// assume dispid is the correct DISPID for the "Render" method
HRESULT hresult = idisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &args, &result, NULL, NULL);
调用返回时 的值为hresult
0 ( S_OK
),但渲染的图片是我显示的单色图像,仅使用图像左下角的颜色。
我如何滥用IDispatch::Invoke
?