Pomoc w zamianie Stystem::String^ na char*

Pomoc w zamianie Stystem::String^ na char*
EM
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 3
0

Witam. Walczę z tym już pewien czas i nie daje rady :(

Zmiana nazwy pliku za pomocą rename działa dobrze jeśli "nowanazwa" jest podana od razu. Chciałbym aby zawartość string "data" była przypisana do *char nowanazwa **. Efektem byłoby utworzenie pliku o nazwie składającej się z daty i czasu.

Kopiuj
    					GetSystemTime(&st);
						System::String^ data;
						data = ("Data_"+st.wDay+"_"+st.wMonth+"_"+st.wYear+" Czas_"+(st.wHour+1)+"_"+st.wMinute+"_"+st.wSecond+".avi");
			
			

						char* nowanazwa = "coś.avi";
						if(ruch_okno->ShowDialog() == ::DialogResult::OK){reset();rename("tmp.avi", nowanazwa);}

Proszę o pomoc :)

Zellus
  • Rejestracja: dni
  • Ostatnio: dni
  • Lokalizacja: Wrocław
  • Postów: 474
0

Nie jestem pewien czy dobrze rozumiem, ale to http://www.cplusplus.com/reference/string/string/c_str/ powinno Ci pomóc. Metoda klasy string która zwraca ten string w postaci tablicy charów.

RE
  • Rejestracja: dni
  • Ostatnio: dni
3

@Zellus: klasa std::string to nie to samo, co System::String^.

@Emingy: zdecyduj się na korzystanie z jednego API. Zwłaszcza, gdy to, co chcesz zrobić można wykonać za pomocą obu. Nie ma najmniejszego sensu ich w tym przypadku mieszać. Jak już masz pod ręką .NET to użyj System::IO::File::Move i System::Data.

Azarien
  • Rejestracja: dni
  • Ostatnio: dni
1

Słuchaj się @Rev-a, ale podam jak się konwertuje stringi .NETowe, STL i C-stringi.

Kopiuj
#include <string>
using namespace std;

#include <msclr\marshal.h>
#include <msclr\marshal_cppstd.h>
using namespace msclr::interop;

using namespace System;

int main()
{
	String ^s1 = L"Ala ma kota";

	// konwersja System::String na std::string
	string s2 = marshal_as<string>(s1);

	// konwersja std::string na System::String
	String ^s3a = marshal_as<String^>(s2);
	String ^s3b = gcnew String(s2.c_str());

	// konwersja String na const char*
	marshal_context ctx;
	const char* s4 = ctx.marshal_as<const char*>(s1);

	// konwersja char* na String
	String ^s5a = gcnew String(s4);
	String ^s5b = marshal_as<String^>(s4);


	// w tym miejscu ctx wychodzi z zasięgu, więc automatycznie
	// zwolniona zostanie pamięć wskaźnika s4.
}

Wszędzie zamiast char można użyć unikodowego wchar_t a zamiast string unikodowego wstring. Dotnetowy String jest zawsze unikodowy.

Ogólnie to marshal_as<> używa się tak samo jak rzutowania, np. static_cast czy const_cast.
Wyjątkiem jest konwersja do char* i wchar_t*, gdzie trzeba posłużyć się obiektem marshal_context który automatycznie zwolni przydzieloną pamięć.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.