Я вижу, что вы игнорируете cchText
, можете ли вы получить строку, не заканчивающуюся NULL, с положительным значением для cchText
, что приведет к чтению за концом строки в недействительную память? Эта ошибка будет отображаться как исключение Win32 в конструкторе s_wc
.
Кроме того, вы не проверяете DT_MODIFYSTRING
в параметре dwDTFormat
. Если этот флаг присутствует, то :: DrawTextExW () может перезаписывать недопустимую память. Это будет представлено как исключение Win32 в :: DrawTextExW () или, возможно, как исключение C ++ в деструкторе s_wc
.
1012 * редактировать *
Вот нескомпилированный , непроверенный код, который, как я считаю, подчиняется контракту ::DrawTextExW()
int WINAPI DetouredDrawTextExW(__in HDC hdc,
__inout LPWSTR lpchText,
__in int cchText,
__inout LPRECT lprc,
__in UINT dwDTFormat,
__in LPDRAWTEXTPARAMS lpDTParams)
{
std::vector<wchar_t> v_wc;
int strSize = cchText == -1 ? wcslen(lpchText) : cchText;
v_wc.resize(strSize + 4);
std::copy(lpchText, lpchText + strSize, &v_wc.front());
std::replace(v_wc.begin(), v_wc.end() - 4, L'l', L'!');
int result = ::DrawTextExW(hdc, &v_wc.front(),
strSize, lprc, dwDTFormat, lpDTParams);
if (dwDTFormat & DT_MODIFYSTRING)
{
std::copy(&v_wc.front(), &v_wc.front() + v_wc.size(), lpchText);
}
}