我有一个基于 Windows 7 SP1 Visual Studio 2010 SP1 构建的应用程序。
它CompareString
在 Windows 7 和 Windows XP 上的工作方式似乎不同。我正在创建一个 EndsWith
/ StartsWith
-like (参见 C# String.EndsWith
)方法,但它可以按预期在 Windows 7 上运行,但在 Windows XP 上却不行。
这是我的StartsWith
和EndsWith
:
bool String::StartsWith( const String& value, bool bCaseSensitive ) const
{
if(this->strLen == 0 || value.strLen == 0)
return false;
DWORD flags;
if(bCaseSensitive == false)
flags = LINGUISTIC_IGNORECASE;
else
flags = NORM_LINGUISTIC_CASING;
if( CSTR_EQUAL == CompareStringW(LOCALE_USER_DEFAULT, flags, this->_str, static_cast<int>(value.strLen), value._str, static_cast<int>(value.strLen)) )
return true;
else if(CSTR_EQUAL == CompareStringW(LOCALE_SYSTEM_DEFAULT, flags, this->_str, static_cast<int>(value.strLen), value._str, static_cast<int>(value.strLen)))
return true;
else if(CSTR_EQUAL == CompareStringW(GetThreadLocale(), flags, this->_str, static_cast<int>(value.strLen), value._str, static_cast<int>(value.strLen)))
return true;
else
return false;
}
bool String::EndsWith( const String& value, bool bCaseSensitive ) const
{
if(this->strLen == 0 || value.strLen == 0)
return false;
DWORD flags;
if(bCaseSensitive == false)
flags = LINGUISTIC_IGNORECASE;
else
flags = NORM_LINGUISTIC_CASING;
size_t maxLen;
if(this->strLen < value.strLen)
maxLen = this->strLen;
else
maxLen = value.strLen;
LPCWSTR szStartOffset;
if(maxLen == this->strLen)
szStartOffset = this->_str;
else
szStartOffset = (this->_str + (this->strLen - value.strLen));
if( CSTR_EQUAL == CompareStringW(LOCALE_USER_DEFAULT, flags, szStartOffset, static_cast<int>(maxLen), value._str, static_cast<int>(maxLen)) )
return true;
else if(CSTR_EQUAL == CompareStringW(LOCALE_SYSTEM_DEFAULT, flags, szStartOffset, static_cast<int>(maxLen), value._str, static_cast<int>(maxLen)))
return true;
else if(CSTR_EQUAL == CompareStringW(GetThreadLocale(), flags, szStartOffset, static_cast<int>(maxLen), value._str, static_cast<int>(maxLen)))
return true;
else
return false;
}
如果有人可以帮助我,我将不胜感激。