نمایش نتایج 1 تا 8 از 8

نام تاپیک: تبدیل CString به WCHAR* یا CHAR*

  1. #1

    Question تبدیل CString به WCHAR* یا CHAR*

    چطور CString رو به WCHAR* یا CHAR* تبدیل کنم؟؟؟
    با تشکر

  2. #2

    نقل قول: تبدیل CString به WCHAR* یا CHAR*

    سلام.
    لطفا به این تاپیک رجوع کنید.

    موفق باشید.

  3. #3

    نقل قول: تبدیل CString به WCHAR* یا CHAR*

    کد زیر رو نوشتم :

    //WCHAR * apd[3];
    //apd[0] =L"10200000056F7A68616E";
    //apd[1] =L"10200016076F73746F766172";
    //apd[2] =L"102000460739383931323831";


    بعد ارایه رو به یک متد پاس دادم:

    ret = handleCommands(fd,0,apd);


    همه مقادیر مشابه همین که در اینجا نوشته شده در dll که متد را در ان تعریف کردم قابل دسترسی هست و کار به درستی انجام میشه ...
    حالا میخوام همین مقادیر را به جای اینکه مستقیم تو کد وارد کنم از طریق متغییرtemp بدم... این کد رو نوشتم:

    CString temp=L"102000000";
    temp.Append(csHexString);
    apd[cc]=(WCHAR *)((LPCSTR)temp);


    اما مقادیری که در ارایه هست نا معلوم و یک سری کاراکتر نامرتبط است .... چه چیزی را تست کنم چه تغییراتی اعمال کنم که مقادیر بدون تغییر منتقل شوند؟؟؟
    (در DLL امکان تعریف متغییری از نوع CString نیست)
    عکس های ضمیمه عکس های ضمیمه
    • نوع فایل: jpg ps.JPG‏ (71.1 کیلوبایت, 26 دیدار)

  4. #4

    نقل قول: تبدیل CString به WCHAR* یا CHAR*

    سلام.
    با فرض به اینکه برنامه رو با Character Set یونیکد Compile کنیم، چرا اینطور عمل نمی کنید:

    CString str = L"102000000";
    str.Append(L"87654321");

    WCHAR *p1 = (WCHAR *)(LPCWSTR)str;
    WCHAR *p2 = str.GetBuffer();


    به بیان دیگه هم می تونید توسط خط چهارم، هم خط پنجم (یکی از این دو) به Pointer درونی CString که (در صورت Unicode بودن Charset، که اگر نباشه، اونوقت از اون L Literal نمیشه استفاده کرد) یک WCHAR هست، برسید.

    موفق باشید.

  5. #5

    نقل قول: تبدیل CString به WCHAR* یا CHAR*

    نقل قول نوشته شده توسط mehdi.mousavi مشاهده تاپیک
    سلام.
    با فرض به اینکه برنامه رو با Character Set یونیکد Compile کنیم، چرا اینطور عمل نمی کنید:

    CString str = L"102000000";
    str.Append(L"87654321");

    WCHAR *p1 = (WCHAR *)(LPCWSTR)str;
    WCHAR *p2 = str.GetBuffer();


    به بیان دیگه هم می تونید توسط خط چهارم، هم خط پنجم (یکی از این دو) به Pointer درونی CString که (در صورت Unicode بودن Charset، که اگر نباشه، اونوقت از اون L Literal نمیشه استفاده کرد) یک WCHAR هست، برسید.

    موفق باشید.
    برنامه رو با Character Set یونیکد Compile می کنم
    الان این کدی که شما برام نوشتی اوکی باهاش مشکلی ندارم ...
    ولی اگر به جای اینکه مقادیر را اینطوری بدم :

    CString str = L"102000000";


    از یک متغییر استفاده کنم که مثلا داده رو از یک پایگاه داده ای میخونه اونوقت نمی تونم از حرف L استفاده کنم _T() رو هم تست کردم که توفیقی نکرد ودر نهایت من داده ها رو در یک ارایه میریزم و به dll ارسال می کنم... داده ها در این شرایط وقتی به dll ارسال می شن اونجا به صورت کاراکتر های نا خوانا نشون داده میشه اما در حالت اول که مقدار CString را داخل کد همراه با L وارد می کنم مشکلی نیست و در dll عینا دریافت میشه:

    CString str = d->readParameter(i);
    آخرین ویرایش به وسیله ostovarit : یک شنبه 28 فروردین 1390 در 16:42 عصر

  6. #6

    نقل قول: تبدیل CString به WCHAR* یا CHAR*

    سلام.
    کد زیر دقیقا چی برمیگردونه؟ (لطفا Signature تابع رو بنویسید، البته اگر Body اش رو بذارید که راحت تر میشه پی به موضوع برد).

    d->readParameter(i);


    آیا حافظه برگشتی این متود از Heap گرفته شده؟ آیا این امکان وجود داره که قبل از ارسال WCHAR به DLL، حافظه مربوطه (به هر دلیلی، یکیش استفاده از Thread ها) unallocate بشه؟

    موفق باشید.

  7. #7

    Question نقل قول: تبدیل CString به WCHAR* یا CHAR*

    نقل قول نوشته شده توسط mehdi.mousavi مشاهده تاپیک
    سلام.
    کد زیر دقیقا چی برمیگردونه؟ (لطفا Signature تابع رو بنویسید، البته اگر Body اش رو بذارید که راحت تر میشه پی به موضوع برد).

    d->readParameter(i);


    آیا حافظه برگشتی این متود از Heap گرفته شده؟ آیا این امکان وجود داره که قبل از ارسال WCHAR به DLL، حافظه مربوطه (به هر دلیلی، یکیش استفاده از Thread ها) unallocate بشه؟

    موفق باشید.
    اون تابع مقدار CString رو بر میگردونه در اینجا رشته ی 10200000056f7a68616e ....

    مقدار بدست اومده از تابع d->readParameter رو در یک متغییر از نوع CString ذخیره می کنم ... و متد داخل dll مورد نظر(handleCommands) پارامتری از نوع WCHAR میگیره ... من فکر میکنم توی تبدیل CString به WCHAR اشتباهی می کنم و یا در متد (handleCommands) پس از گرفتن مقدار باید تغییری روی اون اعمال کنم تا به حالت عادی خودش برگرده ... فکر نمی کنم که unallocate بشه چون من که تردی تعریف نکردم و اگر همین مقدار رو دستی در کد بدم بدون مشکل در dll قابل دریافته.


    dll که مقدار رو دریافت میکنه با Character Set یونیکد Compile می شه. اما dll من که متد داخل اون رو صدا میزنه و مقدار رو بهش پاس میدم با Multi-Byte کامپایل شده که امکان تغییرش وجود نداره و در صورت تغییر به یونیکد 37 تا ارور جور وا جور بهم میده.

    من مقداری رو که در متغییر میریزم رو چک کردم :

    apd[0]=(WCHAR *)((LPCTSTR)temp); //temp = 10200000056f7a68616e



    اما بعد از تبدیل مقدار apd[0] برابر بود با:
    ?????????????ـuـففOـ?ـ????????????
    ??ـ?ـ??­

    با تشکر
    آخرین ویرایش به وسیله ostovarit : دوشنبه 29 فروردین 1390 در 09:35 صبح

  8. #8

    نقل قول: تبدیل CString به WCHAR* یا CHAR*

    سلام.
    بسیار خوب. کد زیر رو در نظر بگیرید (فرض می کنم که این کد با Multi-Byte CharSet کامپایل شده باشه):

        CString str = _T("102000000");
    LPSTR p = (LPSTR)(LPCTSTR)str;


    بدین ترتیب من از str یک CHAR * گرفتم. حالا فرض کنید متودی به اسم Test داریم که WCHAR * میگیره:

    VOID Test(WCHAR *p)
    {
    }


    حالا برای پاس کردن p به Test، باید CHAR * رو به WCHAR * تبدیل کنم (و الا اطلاعات نادرست، درست مثل همون چیزی که شما ذکر کردید به اون متود پاس میشه اگر str رو یک ضرب به WCHAR * کست کنم). این تبدیل چطوری باید انجام بشه؟ با استفاده از یک Macro به اسم A2W...

    USES_CONVERSION;
    Test(A2W(p));


    در واقع اینجا من دارم با A2W اون p رو از CHAR * به WCHAR * تبدیل می کنم. به USES_CONVERSION دقت کنید! اونو باید حتما قبل از اولین استفاده از A2W (یا دیگر Macro های مربوطه برای انجام چنین تبدیل هایی) در یک Block، بنویسید... حالا اگر برنامه رو Compile کنید و Trace کنید، می بینید اطلاعات بدرستی از CHAR به WCHAR تبدیل میشه و متود Test همون str اصلی رو دریافت می کنه...

    موفق باشید.

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •