LPCTSTR
- указатель на массив const wchar_t
.strPermission
указывает на первый символ массива.L"0"
является строковым литералом, который представляет собой массив const wchar_t
, который распадается на указатель const wchar_t
.Но указатели не равны, они указывают на разные массивы.Это , почему мы изобрели C ++.Пожалуйста, используйте это.
std::wstring strPermission = Method();
return (strPermission == L"0"); //works like magic!
или, если Method
возвращает что-то, что вы должны сохранить, в минимум сделайте это
std::unique_ptr<wchar_t[]> strPermission = Method();
return (std::wcscmp(strPermission.get(), L"0")==0);
//wcscmp is for comparing strings, but returns 0 if they're equal.
Также вы уверены, что strPemission
указывает на массив, который содержит нулевой символ, за которым следует нулевой символ?Если нет, и вы не используете wstring
, то вы также должны проверить, что он указывает на массив
if (strPermission)
//do stuff
else
//its a NULL pointer.
Крис подтолкнул меня указать, что тип LPCTSTR
на самом деле зависит от параметров компилятора.По вашему коду я могу сказать, что вы кодируете с установленным _UNICODE
, что делает его const wchar_t*
, но если вы хотите иметь возможность компилировать с другими опциями (я не могу придумать вескую причину для этого) вы должны использовать _tcscmp
для сравнения, иметь литералы как _T("0")
, и они будут массивами TCAHR
.Для строк вам нужно будет где-то добавить typedef:
#ifdef _UNICODE
typedef std::string std::tstring
//you'll probably have to add more t helper functions here
#else
typedef std::string std::wstring
//you'll probably have to add more t helper functions here
#endif
Если вы хотите быть уверены, что ваш код всегда _UNICODE
(что я и делаю), явно вызовите MethodW()
вместо Method()
.(Существует также соответствующий MethodA()
, но нет особых причин для его вызова).
Существует также макрос UNICODE
, но он всегда должен совпадать с макросом _UNICODE
.(Никогда не определяйте их самостоятельно, они относятся к параметрам проекта)