ورود

View Full Version : استفاده از کدهای managed در Visual C++ .Net



حسین محمدی
یک شنبه 11 اسفند 1387, 11:26 صبح
با سلام

من در برنامه خود که با ++VC نوشته ام. می خواهم از کدهای net. استفاده کنم.
حال یک متغیر از نوع System::String تعریف کرده و آنرا برابر یک مقدار قرار می دهیم.

چگونه می توانم این مقدرا را داخل یک آرایه از جنس char یا wchar_t کپی کنم.



String ^str = "Hello";
LPTSTR buffer = (LPTSTR)malloc(sizeInBytes);
buffer = str; ?

Mehdi Asgari
یک شنبه 11 اسفند 1387, 13:53 عصر
http://www.codeproject.com/KB/string/StringConvertor.aspx

حسین محمدی
پنج شنبه 22 اسفند 1387, 15:31 عصر
می خواستم بدانم بر عکس آن چگونه است؟

یعنی من محتویات داخل یک Edit Ctrl را می خواهم داخل یک متغیر از نوع ^String بریزم.
چگونه می توانم این کار را انجام دهم.

Nima_NF
پنج شنبه 22 اسفند 1387, 19:40 عصر
char * unmanagedString = "your text here";

// unmanaged to managed
String ^ managedString = Marshal::PtrToStringAnsi((IntPtr) (char *) unmanagedString);

------------------
String^ managedString = "your text here";

// managed to unmanaged
char* unmanagedString = (char*) Marshal::StringToHGlobalAnsi(managedString).ToPoin ter();

// Free unmanaged memory
Marshal::FreeHGlobal((IntPtr)unmanagedString );

توابع فوق را از MSDN مطالعه کنید.

برای unicode توابع و راه های بسیار زیاد دیگری نیز وجود دارد. (مانند PtrToStringChars)

در انتهای لینک زیر لینک های دیگری هست که انواع روش ها را با مثال ذکر می کند که حتما مطالعه کنید:
Using C++ Interop -Implicit PInvoke (http://msdn.microsoft.com/en-us/library/2x8kf7zx%28VS.80%29.aspx)

و این لسنک شامل چند مثال دیگر:
How to convert from System::String* to Char* in Visual C (http://support.microsoft.com/default.aspx?scid=kb;EN-US;311259)

حسین محمدی
سه شنبه 11 فروردین 1388, 12:49 عصر
من در msdn یک روش تبدیل را به این شکل دیدم.



pin_ptr<constwchar_t> unmangedStr = PtrToStringChars(managedStr);


و در توضیح pin_ptr در msdn چنین نوشته شده است:



pin_ptr lets you declare a pinning pointer.
A pinning pointer is an interior pointer that prevents the object pointed into from moving on the garbage-collected heap (the value of a pinning pointer is not changed by the common language runtime).
This is necessary when passing the address of a managed class to an unmanaged function because the address will not change unexpectedly during resolution of the unmanaged function call.


pin_ptr باعث می شود تا در هنگام خواندن اطلاعات ، garbage-collector آنها را جابجا نکند و اطلاعات ما به درستی خوانده شود. ولی آیا استفاده از pin_ptr برنامه را به هم نمی ریزد و تا چه زمانی اطلاعات در garbage-collected heap حرکت نمی کنند؟

حسین محمدی
سه شنبه 18 فروردین 1388, 10:32 صبح
اگر می شود در مورد PtrToStringChars بیشتر توضیح بدهید.
در مورد تبدیل انواع رشته ای به TCHAR و یونیکد بیشتر توضیح بدهید.

حسین محمدی
سه شنبه 18 فروردین 1388, 12:41 عصر
چگونه می توان داده های از جنس System.DateTime را به COleDateTime یا CTime یا DBTIMESTAMP تبدیل کرد؟

Nima_NF
سه شنبه 18 فروردین 1388, 18:12 عصر
باعث می شود تا در هنگام خواندن اطلاعات ، garbage-collector آنها را جابجا نکند و اطلاعات ما به درستی خوانده شود. ولی آیا استفاده از pin_ptr برنامه را به هم نمی ریزد و تا چه زمانی اطلاعات در garbage-collected heap حرکت نمی کنند؟


نوع pin_ptr یک اشاره پیشرفته تر از native هست که می تواند هر نوعی را در خود نگه دارد، زمانی هم از بین می رود که ببیند به شیئی که اشاره می کند دیگر وجود ندارد(و خارج از حوزه باشد) و یا خودتان آن شئی را به اشاره گر دیگری بدهید تا برایتان نگه دارد و یا به چیز دیگری کلا اشاره کند. در صورت نیاز می توانید از nullptr هم استفاده کنید.
در هر حال همه چیز در دست شماست، می توانید فورا آن را بعد از دریافت به یک اشاره گر native نسبت دهید مثلا:



String ^str = "text";
pin_ptr<const wchar_t> wstr = PtrToStringChars( str );

TCHAR *timeNative = ( TCHAR* ) wstr;



اگر می شود در مورد PtrToStringChars بیشتر توضیح بدهید.
در مورد تبدیل انواع رشته ای به TCHAR و یونیکد بیشتر توضیح بدهید.
منظورتان به چه انواع دیگری هست ؟ فکر نمی کنم تبدیل String به char یا TCHAR و برعکس توضیح بیشتری نیاز داشته باشد...


چگونه می توان داده های از جنس System.DateTime را به COleDateTime یا CTime یا DBTIMESTAMP تبدیل کرد؟
دو راه در اختیار دارید.

-اول اینکه کلا از رشته ها استفاده کنید و اصلا نیاز به تبدیل هم نباشد، یعنی با استفاده از ToString در DateTime :



DateTime myTime = DateTime::Now;
System::Console::WriteLine( myTime.ToString("g") );

pin_ptr<const wchar_t> wstr = PtrToStringChars( myTime.ToString("g") );
printf_s("%S\n", wstr);

TCHAR *timeNative = ( TCHAR* ) wstr; // if you want it...
printf_s("%S\n", timeNative); // 4/7/2009 6:10:40 PM

- راه دیگر دقیقا تبدیل به همان کلاس های مورد نیاز شما هست، به سادگی تک تک سال و ماه و ... را که int هستند در پارامتر های سازنده کلاس قرار دهید تا بسازد، سپس در صورت نیاز می توانید از توابع Format همان کلاس (مثلا برای CTime) استفاده کنید و فرمت را تغییر دهید:



DateTime myTime = DateTime::Now;

CTime timeC( myTime.Year , myTime.Month, myTime.Day,
myTime.Hour, myTime.Minute, myTime.Second, 0 );