Mal wieder konvertierung (nach wchar_t)
-
Hallo,
gibt es andere Möglichkeiten als die in der FAQ angesprochenen um einen String nach wchar_t zu konvertieren?
Denn bei mir hagelt es schon Fehlermeldungen wenn ich <windows.h> einbinde, ganz zu Schweigen von der marshal lib. Da ich aber nicht meinen Code ganz von vorne Programmieren will, frag ich vorab ob es alternativen gibt :).Mfg. BeerStickr
-
Ja, es gibt andere Möglichkeiten.
Sogar haufenweise.
-
hustbaer schrieb:
Ja, es gibt andere Möglichkeiten.
Sogar haufenweise.Nah dann sag mal an, ich bin ganz Ohr...
-
Du musst windows.h *vor* allen "using" Anweisungen einbinden!
-
@Jochen Kalmbach
Ändert komischerweise nichts an den Fehlermeldungen -.-
-
WELCHEN?
-
Jochen, vergiss den Typen. Der ist zu blöd, oder will uns verarschen.
-
Ich will hier keinen verarschen, aber da die Fehlermeldung durch die windows.h ausgelöst wird, und ich "nur" eine Variable konvertieren, und nicht den ganzen Code umändern wollte, hab ich nach verschiedenen Möglichkeiten gefragt. Sonst hätte ich das Beispiel aus der FAQ genutzt. Ich entschuldige mich jedoch falls es diesen Anschein der "Verarschung" hatte.
Auch wenn ich nicht glaube das die Fehlermeldung uns weiter bringt:
: error C2059: Syntaxfehler: 'Konstante'
: error C2238: Unerwartete(s) Token vor ';'
: error C2059: Syntaxfehler: 'Konstante'
: error C2238: Unerwartete(s) Token vor ';'
: error C2059: Syntaxfehler: 'Konstante'
: error C2238: Unerwartete(s) Token vor ';'
: warning C4244: 'Argument': Konvertierung von 'double' in 'int', möglicher Datenverluststatic const int SPI_SETDESKWALLPAPER = 20; static const int SPIF_UPDATEINIFILE = 0x01; static const int SPIF_SENDWININICHANGE = 0x02; static wchar_t* path; static long int iii, A, R, G, B; this->Location = System::Drawing::Point(workingRectangle.Width/2 - this->Width/2, workingRectangle.Height - this->Height*2.75);
Jedenfalls sehe ich keinen den Zusammenhang zwischen dem Code und den Meldungen... Danke für die Hilfe.
-
Hat sich erledigt, hatte das in WordPad gehabt und nicht in Visual Studio.
Der Code läuft super in Visual Studio, WordPad ist dafür nicht geeignet, nur so zur Info.
Werde mir jetzt Visual Studio Express kaufen und ein Buch, "Programmieren für Sau Dummis".Gruß an die Gemeinde...
-
WAS? WordPad ist nicht für SourceCode geeignet!? EIgentlich schreib ich jeden Tag meinen Source-Code mit unterschiedlichen Formatierungen und Schriftarten (Farben/Fett/Italic/Unterstrichen). Und es geht Super!
PS: Die Express-Version braucht man ni9cht zu kaufen, sondern kann man sich einfach runterladen:
http://www.c-plusplus.net/forum/viewtopic-var-t-is-143003.html
-
@Jochen: ich schätze mal dass BärSticker != BeerStickr
@BeerStickr: sorry, aber da du sogut wie keine brauchbaren Anhaltspunkte geschrieben hast, ... lag die Vermutung nahe dass hier ein Scherzbold am Werk ist.
Kannst du versuchen ein Minimal-Beispiel zusammenzubasteln, und das hier posten? Mit den Fehlermeldungen kann ich wie du schon vermutet hast nix anfangen.
Und nur damit wir uns richtig verstehen: du hast einen
System::String
, und willst einenwchar_t const*
, ja? Ich denke dass ich eine Hilfsklasse für genau sowas zuhause habe, die das mit Hilfe der Marshal Klasse macht. Werde ich heute Abend nachsehen wenn ich dran denke.
-
BärSticker schrieb:
Hat sich erledigt, hatte das in WordPad gehabt und nicht in Visual Studio.
Der Code läuft super in Visual Studio, WordPad ist dafür nicht geeignet, nur so zur Info.
Werde mir jetzt Visual Studio Express kaufen und ein Buch, "Programmieren für Sau Dummis".Gruß an die Gemeinde...
WTF? Dieser Beitrag ist nicht von mir, hier erlaubt sich jmd. einen schlechten Scherz (Ich glaub ich sollte mich registrieren). Das Problem besteht weiterhin.
P.S. Könnte jmd. die IP überprüfen und ggf. sperren? Sowas muss nicht sein, bestimmt bin ich nicht der einzige der verarscht wird -.-
-
Für den Fall dass es noch jmd. interessiert:
#include <iostream> using namespace System; ///////////////////////////////////////////////////////////////////////////// public ref class HGlobalHandleGuard { public: HGlobalHandleGuard(System::IntPtr hGlobalHandle) : m_hGlobalHandle(hGlobalHandle), m_isDisposed(false) { } ~HGlobalHandleGuard() { Tidy(); } !HGlobalHandleGuard() { Tidy(); } property bool IsDisposed { bool get() { return m_isDisposed; } } property void* UnmanagedPointer { void* get() { if (m_isDisposed) throw gcnew System::ObjectDisposedException(this->GetType()->FullName); else if (m_hGlobalHandle == System::IntPtr::Zero) return 0; else return static_cast<void*>(m_hGlobalHandle); } } private: void Tidy() { if (m_hGlobalHandle != System::IntPtr::Zero) System::Runtime::InteropServices::Marshal::FreeHGlobal(m_hGlobalHandle); m_hGlobalHandle = System::IntPtr::Zero; m_isDisposed = true; } System::IntPtr m_hGlobalHandle; bool m_isDisposed; }; ///////////////////////////////////////////////////////////////////////////// public ref class UnmanagedStringCopyUni { public: UnmanagedStringCopyUni(System::String^ str) : m_stringCopyGuard(System::Runtime::InteropServices::Marshal::StringToHGlobalUni(str)) { if (!m_stringCopyGuard.UnmanagedPointer) throw gcnew System::InsufficientMemoryException(); } property wchar_t const* UnmanagedPointer { wchar_t const* get() { return static_cast<wchar_t const*>(m_stringCopyGuard.UnmanagedPointer); } } private: HGlobalHandleGuard m_stringCopyGuard; }; ///////////////////////////////////////////////////////////////////////////// public ref class UnmanagedStringCopyAnsi { public: UnmanagedStringCopyAnsi(System::String^ str) : m_stringCopyGuard(System::Runtime::InteropServices::Marshal::StringToHGlobalAnsi(str)) { if (!m_stringCopyGuard.UnmanagedPointer) throw gcnew System::InsufficientMemoryException(); } property char const* UnmanagedPointer { char const* get() { return static_cast<char const*>(m_stringCopyGuard.UnmanagedPointer); } } private: HGlobalHandleGuard m_stringCopyGuard; }; ///////////////////////////////////////////////////////////////////////////// int main(array<System::String ^> ^args) { String^ str = L"Hello World!\n"; UnmanagedStringCopyUni nativeUnicodeString(str); wchar_t const* uniPtr = nativeUnicodeString.UnmanagedPointer; std::wcout << uniPtr; UnmanagedStringCopyAnsi nativeAnsiString(str); char const* ansiPtr = nativeAnsiString.UnmanagedPointer; std::wcout << ansiPtr; return 0; }
-
Warum verwendest Du denn ref-Klassen, wenn es ohne viel besser wäre!? (Siehe FAQ!)
-
Wer weiss das schon?
Ne, ehrlich, ich hab a) nicht in die FAQ geguckt, und b) hab ich mich da einfach an msclr::lock orientiert. Hat mich zwar gewundert, aber msclr::lock is auch ne ref Klasse. Da C++/CLI ja doch einige versteckte Fallstricke zu bieten hat, dachte ich mir dann ich mach das einfach mal so nach
ad FAQ: das marshal_as<> Gedöns von 9er Studio sieht nett aus! (ich arbeite leider noch mit dem 8er Studio)