【发布时间】:2013-09-20 03:12:35
【问题描述】:
我有一个 23x23 位图,我将其从文件加载到 IPictureDisp COM 接口的实例中。我正在使用OleLoadPicture 加载图片,通过IID_IPictureDisp。请假设这正在工作并向我返回一个指向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?
【问题讨论】:
-
Render不兼容自动化,我敢肯定你不能通过Invoke调用它。有什么理由不能只查询IPicture并以常规(早期绑定)方式调用Render? -
我肯定成功地通过
Invoke调用它,并且证明它在我要求的确切位置将位放在DC 上。可悲的是,我不能使用IPicture和早期绑定到IPicture::Render的原因是这是通过一个脚本引擎运行的,为了简单起见,我将其删除。