View Full Version : سوال: تبدیل CString به char*
sepehr1014
چهارشنبه 03 فروردین 1390, 20:35 عصر
سلام
میخواستم بدونم چطور میشه یه CString رو به char * تبدیل کرد؟
من چند ساعت تو اینترنت گشتم (سایت های ایرانی و خارجی) ولی هر چی که امتحان کردم، جواب نداد. (یه سری میگفتن برای Unicode نمیشه و ....)
برای استفاده در برنامه mfc در Visual C++ 2010 میخوام. دلیلش هم اینه که یه Edit Control دارم که CString برمیگردونه. حالا از یه کتابخونه استفاده میکنم که تابعش mu::string_type میگیره. (mu اسم namespace اش هست) مثلا زدم:
_T("abcd")
مشکلی نداشت. حالا میخوام CString رو به char تبدیل کنم و پشتش T_() بزارم...
ممنون میشم کمکم کنید.
mehdi.mousavi
چهارشنبه 03 فروردین 1390, 22:03 عصر
سلام.
اگر هدفتون تبدیل یک CString (از نوع Wide Char) به CHAR (یک بایتی) هستید، می تونید بدین شکل عمل کنید:
CString s(_T("WHATEVER"));
LPTSTR pWide = s.GetBuffer();
USES_CONVERSION;
CHAR *pChar = W2A(pWide);
s.ReleaseBuffer();
در واقع در کد فوق، با استفاده از ماکروی W2A من WCHAR * رو به CHAR * تبدیل کردم...
موفق باشید.
sepehr1014
چهارشنبه 03 فروردین 1390, 23:14 عصر
ممنون دوستان، درست شد
میگم شاید کسی بدردش بخوره:
CString str = ....
str.GetBuffer(0);
mehdi.mousavi
شنبه 06 فروردین 1390, 17:54 عصر
میگم شاید کسی بدردش بخوره:
CString str = ....
str.GetBuffer(0);
سلام.
اگر هدفتون فقط گرفتن Pointer درونی CString هستش (به شرطیکه هیچ تغییری در string بوجود نیارید) می تونید بدین شکل نیز عمل کنید:
TCHAR *p1 = (TCHAR *)((LPCTSTR)s);
که Performance اش بالاتر هم هست.
اما کدی که شما نوشتید، باعث میشه تا Execution Path طولانی تری طی بشه و نتیجه یکسانی بدست بیاد! وقتی میگید GetBuffer(0)
GetBuffer ابتدا طول حافظه تخصیص یافته فعلی رو بررسی میکنه، اگر طول درخواستی شما بیش از میزان مزبور باشه، اضافه حافظه مورد نیاز
Reallocate میشه و Pointer به اون حافظه به شما برمیگرده. حالا وقتی شما این متود رو با پارامتر صفر Call می کنید، در واقع عمل Reallocate
انجام نمیشه، اما روند مزبور طی میشه. در صورتیکه وقتی GetBuffer رو بدون پارامتر صدا کنید، همون اتفاق رخ میده، اما دیگه متود PrepareWrite
فراخوانی نمیشه.
در هر حال، اگر GetBuffer رو با پارامتر صفر Call کردید، حواستون باشه که تابعی که گفتید پارامتری از نوع mu::string_type میگیره، خارج از
حافظه Allocate شده برای اون Pointer ننویسه...
موفق باشید.
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.