علت اینکه توی VS2003 کدت مشکل نداره اینه که توی VS2003 پیشفرض ASCII هست و MessageBox معادل MessageBoxA هستش در صورتی که توی VS2005 پیشفرض Unicode هست و MessageBox معادل MessageBoxW و طبعا این تابع متن رو به صورت Unicode میگیره و پارامتر های رشته ایش از نوع LPCWSTR هستن.
LPCWSTR مخفف LONG POINTER CONST WIDE STRING هستش که معادل :
هستش.
اگه بخوای یه رشته رو به طور مستقیم بهش بدی برای اینکه Unicode باشه باید یه L قبل از " بگذاری:
کد:
MessageBox(NULL, L"Hello!", L"Title", MB_OK);
و یا اگه میخوای از متغیر استفاده کنی باید از آرایه ای از wchar_t (کاراکتر 2 بایتی-wide) استفاده کنی نه char:
کد:
wchar_t strHello[] = L"Hello!", strTitle[] = L"Title";
MessageBox(NULL, strHello, strTitle, MB_OK);
که هیچ کدوم از این 2 روش, روش استاندارد نیستن.
بهترین کار اینه که اگه میخوای از مقدار مستقیم به تابع استفاده کنی بجای گذشتن L در اول رشته, از ماکروی T_ که در فایل <tchar.h> تعریف شده استفاده کنی :
کد:
MessageBox(NULL, _T("Hello!"), _T("Title"), MB_OK);
این کد دیگه به فعال بودن یا نبودن Unicode بستگی نداره. اگه Unicode فعال باشه ("!T("Hello_ معادل "!L"Hello و اگه فعال نباشه از معادل "Hello" هست.
و در حالتی هم که میخواهی از متغیر استفاده کنی بجای استفاده از char یا wchar_t از TCHAR استفاده میکنی که در حالت Unicode برابر wchar_t و در حالت اسکی معادل char هست:
کد:
TCHAR strHello[] = _T("Hello!"), strTitle[] = _T("Title");
MessageBox(NULL, strHello, strTitle, MB_OK);
توی VS 2003 اگه میخواستیم Unicode فعال باشه کافی بود توی Preprocessor Definations مقدار UNICODE_ رو اضافه میکردیم در واقع معادل
میشد اما اگه میخوای توی VS 2005 اصلا یونیکد رو غیر فعال کنی کافیه برعکس رو انجام بدی:
کد:
#ifdef _UNICODE
#undef _UNICODE
#endif
ضمن اینکه از توی Project Properties میشه به این قضیه دسترسی داشت اما یه نگاه سریع کردم ظاهرا توی VS 2005 نت نمیشه UNICODE رو از توی Project Properties غیر فعال کرد و باید از همین undef# استفاده کنی.
پر حرفی کردم!!