برگزیده های پرشین تولز

Problem With : Convert Const Char[] To LPCWSTR

3030l

Registered User
تاریخ عضویت
1 مارس 2004
نوشته‌ها
81
لایک‌ها
0
با سلام به همگی .

آیا راه حلی برای این مشکل سراغ دارید.

'cannot convert parameter 2 from 'const char [20]' to 'LPCWSTR'

این Error برای پارامتر 2 یه MessageBox هستش .آیا به غیر از تبدبل نوع راه دیگری برای این مشکل هست که
لازم نباشه برای هر Error کار خاصی انجام داد و به صورت کلی رفع بشه.

با تشکر.
 

NdR

Registered User
تاریخ عضویت
10 مارس 2004
نوشته‌ها
86
لایک‌ها
0
MessageBoxA که پارامتر دوم و سومش از نوع (* const char) هست. یا MessageBoxW که پارامتر دوم و سومش (* const WCHAR) هست.
و اگه توابع بالا به کارتون نمیاد برای تبدیل بین انواع مختلف string ها اینجا رو بخونید.
 

3030l

Registered User
تاریخ عضویت
1 مارس 2004
نوشته‌ها
81
لایک‌ها
0
ممنون از راهنماایت.
اما همون جوری که اشاره کردم نمیخام از تبدیل انواع استفاده کنم در صورتی که راه دیگری وجود داشته باشه.
این Source File تو VS 2003 مشکلی نداره ولی تو 2005 این Error رو میده در کل هر جایی که از String به صورت "Text" باشه به این شکله .

اصل مطلب : LPCWSTR چه مزیتی داره و String رو باید چه طور براش نوشت.تا این Error تبدیل رو نده.

در ضمن یادم رفت بگم من از ا MessageBoxW استفاده کردم.
 

m3hrz4d

Registered User
تاریخ عضویت
21 سپتامبر 2005
نوشته‌ها
620
لایک‌ها
1
محل سکونت
اصفهان
علت اینکه توی VS2003 کدت مشکل نداره اینه که توی VS2003 پیشفرض ASCII هست و MessageBox معادل MessageBoxA هستش در صورتی که توی VS2005 پیشفرض Unicode هست و MessageBox معادل MessageBoxW و طبعا این تابع متن رو به صورت Unicode میگیره و پارامتر های رشته ایش از نوع LPCWSTR هستن.
LPCWSTR مخفف LONG POINTER CONST WIDE STRING هستش که معادل :
کد:
const wchar_t *
هستش.
اگه بخوای یه رشته رو به طور مستقیم بهش بدی برای اینکه 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_ رو اضافه میکردیم در واقع معادل
کد:
#define _UNICODE
میشد اما اگه میخوای توی VS 2005 اصلا یونیکد رو غیر فعال کنی کافیه برعکس رو انجام بدی:
کد:
#ifdef _UNICODE
#undef _UNICODE
#endif
ضمن اینکه از توی Project Properties میشه به این قضیه دسترسی داشت اما یه نگاه سریع کردم ظاهرا توی VS 2005 نت نمیشه UNICODE رو از توی Project Properties غیر فعال کرد و باید از همین undef# استفاده کنی.
پر حرفی کردم!!
 

NdR

Registered User
تاریخ عضویت
10 مارس 2004
نوشته‌ها
86
لایک‌ها
0
اگه اصلا از unicode استفاده نمیکنید تنظیمات project رو تغییر بدین وگرنه از همون MessageBoxA استفاده کنید.

Properties - > Configuration Properties -> General -> Character Set

بزاریدش رو: Use Multi-Byte Character Set

که هیچ کدوم از این 2 روش, روش استاندارد نیستن.

استفاده از ""L برای یونیکد استاندارد ++C هست و ماکرو T_ مختص مایکروسافت.​
 

m3hrz4d

Registered User
تاریخ عضویت
21 سپتامبر 2005
نوشته‌ها
620
لایک‌ها
1
محل سکونت
اصفهان
اگه اصلا از unicode استفاده نمیکنید تنظیمات project رو تغییر بدین وگرنه از همون MessageBoxA استفاده کنید.

Properties - > Configuration Properties -> General -> Character Set

بزاریدش رو: Use Multi-Byte Character Set



استفاده از ""L برای یونیکد استاندارد ++C هست و ماکرو T_ مختص مایکروسافت.​

درسته منظورم از استاندارد روش صحیح بود! که برنامه بتونه برای هر 2 سیستم کار کنه! شما اگه همه ی رشته ها رو با ""L بنویسی بعد اگه بخوای برنامه رو در حالت ASCII کامپایل کنی باید همه ی رشته ها رو عوض کنی. نه؟
اصلا خود LPCWSTR رو هم توی این کامپایلر من توی winnt.h تعریف شده که جزو استاندارد C نیست!!
 

NdR

Registered User
تاریخ عضویت
10 مارس 2004
نوشته‌ها
86
لایک‌ها
0
بله در صورتی که رشته ها در هر دو حالت یکسان باشن ولی فرض کنید رشته ها مثلا فارسی باشن اگه بخواین بدون یونیکد کامپایل کنید بازم ناچارید تمام رشته ها رو عوض کنید.
 
بالا