您正在将您的位图指针的copy
我在另一个函数中转换的位图结构在函数返回后设置为NULL
功能:
HRESULT RessourcesLoader::decode(LPCWSTR name,ID2D1Bitmap* bitmap1) {
int hr = S_OK;
hr = LoadFile(name, bitmap1);
assert(SUCCEEDED(hr));
hr = rendertarget->CreateBitmapFromWicBitmap(wicConverter, NULL, &bitmap1);
assert(SUCCEEDED(hr));
return hr;
这里叫:
ID2D1Bitmap* bmp1=NULL;
ID2D1Bitmap* bmp2=NULL;
rl->decode(L"Menu_corner.png", bmp1);
rl->decode(L"Menu_side.png", bmp2);
((函数hr是S_OK且结构包含所有内容,一旦函数返回指针为NULL)这是范围问题吗?
[请记住,像ID2D1Bitmap* bitmap1
这样的C ++参数是passed by value。这意味着您有两个完全独立(且几乎不相关)的变量bmp1
和bitmap1
。这两个变量之间唯一的关系是bitmap1
以与bmp1
被调用时的decode
相同的值开始生命-即NULL
。
您的decode
逻辑调用CreateBitmapFromWicBitmap
,传入bitmap1
的地址,然后CreateBitmapFromWicBitmap
小心地用新创建的位图的地址填充bitmap1
。 但是完全不影响bmp1
。因此bmp1
仍设置为null。您可以通过在return hr
上放置一个断点,然后查看bmp1
和bitmap1
的内容来自己检查。
如果您希望解码更改bmp1
的内容,则需要将bmp1
的地址传递给decode
,而不是内容。这意味着bitmap1应该是ID2D1Bitmap **
类型,并且应该这样调用decode ... rl->decode(L"Menu_corner.png", &bmp1);
更新
[几条评论指出,我在说“ C ++参数是通过值传递”时相当粗心,我在上面的文字中改写了文字以使其更加集中。
注释还指出,C ++参数既可以通过引用也可以通过值传递。对于使用语法decode
的ID2D1Bitmap*& bitmap1
功能。
我不得不承认,我对ID2D1Bitmap** bitmap1
和ID2D1Bitmap*& bitmap1
的相对优缺点有些矛盾。但这可能比我的个人偏见多。
您正在将您的位图指针的copy
如果要修改传递给函数的指针,则需要传递引用或指向它们的指针:
HRESULT RessourcesLoader::decode(LPCWSTR name, ID2D1Bitmap*& bitmap1) {
// ^----- Pass by reference
int hr = S_OK;
hr = LoadFile(name, bitmap1);
assert(SUCCEEDED(hr));
hr = rendertarget->CreateBitmapFromWicBitmap(wicConverter, NULL, &bitmap1);
assert(SUCCEEDED(hr));
return hr;
}
您正在将您的位图指针的copy