Unicode-Fehler

skaoson

Grünschnabel
Guten Tag,

Ich habe folgendes Problem mit dem Unicode, wenn ich das richig verstanden habe.

Code:
void MyWindow::Drucken()

{
    QString dateiname = datei->text();
    std::string s1 = dateiname.toAscii().data();
    char* tmp = new char [s1.size() + 1];
    strcpy(tmp, s1.c_str());
    ShellExecute( NULL, ("print"), tmp, NULL,  NULL, SW_HIDE );  
}

Fehlermeldung: cannot convert 'const char*' to 'const WCHAR*' for argument '2' to 'HINSTANCE__* ShellExecuteW(HWND__*, const WCHAR*, const WCHAR*, const WCHAR*, const WCHAR*, INT)'

Ich habe was gelesen, das es mit einem L beheben könnte, ich habe es allerdings falsch gemacht, da es nicht funktioniert hat.

Code:
ShellExecute( NULL, _L(("print")), tmp, NULL,  NULL, SW_HIDE );
Fehlermeldung: error: '_L' was not declared in this scope
 
Zuletzt bearbeitet:
In tchar findest du folgendes Makro:
Code:
_T(text)

Der Compiler versteht:
Code:
L"Text";

Aber da ist noch ein anderes Problem:
Du scheinst nicht Unicode verwenden zu wollen, da ja tmp bei dir char und nicht wchar_t ist, hast aber offensichtlich als Zielcharacterset Unicode ausgewählt, da ShellExecute definiert ist als ShellExecuteW
 
Das ist nicht ein "richtig" oder ein "falsch". Du musst dich einfach entscheinden, was du willst. Unicode oder Multibyte. Und je nach dem dann in den Projekteigenschaften das entsprechende Charset einstellen und dann weiterhin so arbeiten.

Die kompatibelste Lösung ist natürlich allgemein einfach TCHAR zu verwenden, das sich deinem Charset "anpasst".
 
ok danke, ich habs jetzt so geschrieben:
Code:
void MyWindow::Drucken()

{
    QString dateiname = datei->text();
    std::string s1 = dateiname.toAscii().data();
    char* tmp = new char [s1.size() + 1];
    strcpy(tmp, s1.c_str());
    ShellExecute( NULL, _T("print"), _T("tmp"), NULL,  NULL, SW_HIDE );
}
Das funktioniert soweiit, es macht jedoch nicht was ich will. Keine Datei wird ausgedruckt, da tmp kein tmp.txt hat. Ich möchte allerdings der Inhalt von tmp ausdrucken. In diesem Fall irgendeine Dateiname.txt, die ich vorher eingelesen habe und im tmp gespeichert habe.


Code:
ShellExecute( NULL, _T("print"), _T(tmp), NULL,  NULL, SW_HIDE );
Wenn ich es so schreibe, bekomme ich diese Fehlermeldung: error: 'Ltmp' was not declared in this scope
Meine Frage wie soll ich tmp schreiben, damit ich der Inhalt von tmp bzw. die Dateiname ausdrucken kann
 
Hi.

Nimm einfach direkt die ANSI Funktion:
C++:
ShellExecuteA( NULL,  "print", tmp, NULL,  NULL, SW_HIDE );
\edit: Du kannst es auch noch etwas vereinfachen indem du die toStdString Methode von QString verwendest.

Gruß
 
Zuletzt bearbeitet:
ja wenn ich das wüsste, hätte ich die Ansi Funktiont genommen schon längst genommen.

ka wie ich das in ansi schreiben soll.
Code:
void MyWindow::Drucken()

{
    QString dateiname = datei->text();
    std::string s1 = dateiname.toAscii().data();
    char* tmp = new char [s1.size() + 1];
    strcpy(tmp, s1.c_str());
    ShellExecute( NULL, "print"), (tmp), NULL,  NULL, SW_HIDE );
}
 
Das hat dir ja deepthroat bereits geschrieben:
ShellExecuteA

Aber warum überhaupt in deinem Projekt UNICODE definieren, wenn du so eine Abscheu gegen Unicode hegst?
 
ja wenn ich das wüsste, hätte ich die Ansi Funktiont genommen schon längst genommen.
Du hättest meinen Codeschnipsel nur kopieren müssen.

Übrigens hast du dort noch ein Speicherleck.

C++:
void MyWindow::Drucken() {
    QString dateiname = datei->text();
    ShellExecuteA( NULL, "print", dateiname.toStdString().c_str(), NULL,  NULL, SW_HIDE );
}
Gruß
 
Zuletzt bearbeitet:
Zurück