سلام.
بسیار خوب. کد زیر رو در نظر بگیرید (فرض می کنم که این کد با 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 اصلی رو دریافت می کنه...

موفق باشید.