آژانس هواپیماییexchanging

Problem With : Convert Const Char[] To LPCWSTR

شروع موضوع توسط 3030l ‏16 نوامبر 2007 در انجمن خانواده C++ , C

  1. 3030l

    3030l Registered User

    تاریخ عضویت:
    ‏1 مارس 2004
    نوشته ها:
    81
    تشکر شده:
    0
    با سلام به همگی .

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

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

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

    با تشکر.
     
  2. NdR

    NdR Registered User

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

    3030l Registered User

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

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

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

    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# استفاده کنی.
    پر حرفی کردم!!
     
  5. NdR

    NdR Registered User

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

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

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

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

    NdR Registered User

    تاریخ عضویت:
    ‏10 مارس 2004
    نوشته ها:
    86
    تشکر شده:
    0
  7. m3hrz4d

    m3hrz4d Registered User

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

    NdR Registered User

    تاریخ عضویت:
    ‏10 مارس 2004
    نوشته ها:
    86
    تشکر شده:
    0
    بله در صورتی که رشته ها در هر دو حالت یکسان باشن ولی فرض کنید رشته ها مثلا فارسی باشن اگه بخواین بدون یونیکد کامپایل کنید بازم ناچارید تمام رشته ها رو عوض کنید.
     
  9. 3030l

    3030l Registered User

    تاریخ عضویت:
    ‏1 مارس 2004
    نوشته ها:
    81
    تشکر شده:
    0
    ممنون از کمک همگی.