IPictureDisp
ファイルからCOM インターフェイスのインスタンスにロードする 23x23 ビットマップがあり ます。OleLoadPicture
を使用して画像を読み込んでいIID_IPictureDisp
ます。これが機能していて、 への有効なポインターを返していると仮定してください。そこから問題なくポインターIPictureDisp
を取得できます。IDispatch
期待どおり、23 と 23 として返される画像のとメンバーIDispatch::Invoke
の値を取得するために使用することもできます。Height
Width
問題は、何らかの理由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
ますか?