トップ回答者
GetDrawingEffect()でめちゃくちゃな値が返る

質問
-
エフェクトを何も設定しない状態でGetDrawingEffect()を呼び出すと、drawingEffectにはNULLが設定されますが、range
にはめちゃくちゃな値が設定されます
(文字列の長さが設定されるのが本来の動作だと思います)
これを回避する方法はないでしょうか
IDWriteFactory* pDWriteFactory; if (SUCCEEDED(hr)) { hr = DWriteCreateFactory( DWRITE_FACTORY_TYPE_SHARED, __uuidof(IDWriteFactory), reinterpret_cast<IUnknown**>(&pDWriteFactory) ); } IDWriteTextFormat *pTextFormat; float dpisize = Util::PointToDpiSize(point); pDWriteFactory_->CreateTextFormat( "MS Gothic", NULL, DWRITE_FONT_WEIGHT_REGULAR, DWRITE_FONT_STYLE_NORMAL, DWRITE_FONT_STRETCH_NORMAL, dpisize, L"", &pTextFormat ); IDWriteTextLayout* pTextLayout; WCHAR* str = "こねこねこね"; hr = pDWriteFactory_->CreateTextLayout( str, wcs_len(str), pTextFormat, 100, 100, &pTextLayout ); DrawingEffect* drawingEffect; DWRITE_TEXT_RANGE range; pTextLayout->GetDrawingEffect(0,reinterpret_cast<IUnknown **>(&drawingEffect),&range);
回答
-
range をあなたのコードで初期化していませんよね?
GetDrawingEffect を呼び出す前の段階で未定義の値になっていませんか?
そして、GetDrawingEffect が単に書き換えないだけではありませんか?
(Debug ビルドの場合は 0 になるかもしれませんが、Release ビルドではその保障はなかったはず)単純に DWRITE_TEXT_RANGE range の行で値を代入しておいてから呼び出せば事足りるかもしれません。
なお、この例のコードに限らず、C/C++ のローカル変数は初期化する癖をつけておいた方が安全だと思っています。# DWRITE_TEXT_RANGE range = {0, 0}; あたりかな。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。
すべての返信
-
range をあなたのコードで初期化していませんよね?
GetDrawingEffect を呼び出す前の段階で未定義の値になっていませんか?
そして、GetDrawingEffect が単に書き換えないだけではありませんか?
(Debug ビルドの場合は 0 になるかもしれませんが、Release ビルドではその保障はなかったはず)単純に DWRITE_TEXT_RANGE range の行で値を代入しておいてから呼び出せば事足りるかもしれません。
なお、この例のコードに限らず、C/C++ のローカル変数は初期化する癖をつけておいた方が安全だと思っています。# DWRITE_TEXT_RANGE range = {0, 0}; あたりかな。
質問スレッドで解決した場合は、解決の参考になった投稿に対して「回答としてマーク」のボタンを押すことで、同じ問題に遭遇した別のユーザが役立つ投稿を見つけやすくなります。