IPictureDispファイルからCOM インターフェイスのインスタンスにロードする 23x23 ビットマップがあり ます。OleLoadPictureを使用して画像を読み込んでいIID_IPictureDispます。これが機能していて、 への有効なポインターを返していると仮定してください。そこから問題なくポインターIPictureDispを取得できます。IDispatch
期待どおり、23 と 23 として返される画像のとメンバーIDispatch::Invokeの値を取得するために使用することもできます。HeightWidth
問題は、何らかの理由IDispatch::Invokeでメソッドを呼び出すために使用するRenderと、期待する画像ではなく 23x23 のモノクロの正方形が描画されることです。さらに、モノクロの正方形の色は、ビットマップの左下のピクセルの色に対応しています (ビットマップの 0 番目のピクセルであると想定しています)。


上の画像は私が使用しているビットマップです (通常のサイズで、色が見えるように 4 倍に拡大されています)。下の画像が実際にレンダリングしたものです。
問題は、私が を呼び出す方法に関係している可能性が高いと思いますIDispatch::Invoke。
私がやりたいことは(疑似コード)です:
pic.Render(hdc, x, y, w, h, 0, h-1, w, -h, &rc)
wherercは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ますか?