tutorials.de Buch-Aktion 05/2012
Seite 1 von 2 12 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
26
ZUGRIFFE
1332
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    Hallo zusammen,

    ich möchte gerne eine Benutzereingabeaufforderung in meine Konsolenapplikation einbauen, die den Wert als PWSTR speichert, da die folgende Funktion, die den Wert benötigt, nur dieses Format akzeptiert.
    Wenn ich jedoch das normale cin und cout aus iostream benutze, funktioniert dies leider nicht, denn mein beschränktes Wissen erlaubt es mir nur den Eingabewert in einem String, Char oder Int zu speichern.

    Gibt es eine Möglichkeit den Wert direkt in PWSTR zu speichern oder in PWSTR umzukonvertieren? Wenn ja, hat jemand ein Beispiel zur Hand?

    Vielen Dank im Voraus,
    Felsti
     

  2. #2
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Casten wäre vielleicht eine Möglichkeit.

    Was ist das denn für eine Funktion die nur einen PWSTR akzeptiert? Oder zeig mal den entsprechenden Codeausschnitt.


    mffg
    umbrasaxum
     

  3. #3
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    Also um genau zu sein handelt es sich um Funktionen aus dem RMS SDK von Microsoft, die ich mit einer Benutzereingabe füttern will.

    Beispiel:

    Code :
    1
    2
    3
    4
    5
    6
    
    hr = DRMCreateUser( 
                            wszGroupID,  
                            NULL,
                            L"Windows", 
                            &hUser
                            );

    Die wszGroupID ist dabei der Wert, der die Eingabe bekommen soll. Bis jetzt ist es als Flag in der Kommandozeile gelöst, was aber bei der Angabe von mehreren Werten unschön und unerwünscht ist.
    Geändert von Felsti (29.04.05 um 18:46 Uhr)
     

  4. #4
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Und wenn du das so machst:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
    char *wszGroupID;
     
    cin>>wszGroupID;
     
    .........
    hr = DRMCreateUser( 
                            (PWSTR)wszGroupID,  
                            NULL,
                            L"Windows", 
                            &hUser
                            );


    mfg
    umbrasaxum
     

  5. #5
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    Danke für den Tipp, aber wenn ich das eingebe kommt folgende Fehlermeldung beim Kompilieren:

    error C2679: Binärer Operator '>>': Es konnte kein Operator gefunden werden, der einen rechtsseitigen Operator vom Typ 'PWSTR' akzeptiert (oder keine geeignete Konvertierung möglich)
     

  6. #6
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Du sollst ja wie im Beispiel auch char * nehmen und nicht PWSTR.


    mfg
    umbrasaxum
     

  7. #7
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    Ach verdammt, ich war gerade schon aufm Sprung und hab nen Tippfehler drin gehabt.

    Ich habe zu hause jetzt nicht mehr die Umgebung um es konkret zu testen, aber die Kompilierung war fehlerfrei!

    Vielen Dank für deine Hilfe, falls jetzt noch was schief läuft würd ich mich nochmal melden.

    Bis denn, Felsti
     

  8. #8
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Mit einfachem Castens ist's da nicht getan: PWSTR ist ein Pointer auf einen Unicode-String.

    Windows stellt aber netterweise Funktion zum Umwandeln zur Verfügung:

    MultiByteToWideChar

    CP_ACP als Codepage sollte ausreichen, die restlichen Parameter sind relativ klar.
     

  9. #9
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    Hallo nochmal,

    mein Code sieht jetzt folgendermaßen aus:
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
    char *input;
    cout<<"Namen eingeben:\n";
    cin>>input;
    PWSTR wszGroupID3;
    MultiByteToWideChar(CP_ACP, 0, input, -1, wszGroupID3, 0);
     
    hr = DRMCreateUser( 
                            wszGroupID3,  
                            NULL,
                            L"Windows", 
                            &hUser2
                            );

    jedoch ist das Ergebnis ähnlich dem einfach casten, denn es wird jetzt ein lustiger Wert wie "汢䁡摳晫搮e@testserver.local" oder gar nur Kästchen in die Funktion übergeben. Was ist denn da jetzt wieder falsch gelaufen?

    Grüße, Felsti
    Geändert von Felsti (02.05.05 um 13:49 Uhr)
     

  10. #10
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Ein PWSTR ist ein Pointer auf einen WSTR. Da du den nirgendwo hinzeigen lässt, geht das in die Hose.
    Mach ein WSTR[200]:

    WSTR wszGroupID3[200];

    Dann müsste der Compiler auch wszGroupID3 als Parameter für die beiden Funktionen zulassen.
     

  11. #11
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    So langsam bin ich am verzweifeln, denn wenn ich WSTR wszGroupID3[200]; eintrage, dann bekomme ich beim kompilieren "WSTR: nichtdeklarierter Bezeichner".
    Wie schon eingangs erwähnt habe ich nicht viele Kenntnisse in C++ und versteh echt nur noch Bahnhof. Das Programmstück sollte jetzt schon vor Tagen fertig sein und ich komm nicht von der Stelle
    Gibts vielleicht irgendwo ne gute Dokumentation darüber was überhaupt WSTR und PWSTR genau sind und wie sie funktionieren?
     

  12. #12
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    ach flixt, mach aus WSTR ein WORD bzw. wenn möglich wchar_t. Ansonsten ein unsigned short int.
    Die MSDN sollte die Typen beschreiben können (http://msdn.microsoft.com)
     

  13. #13
    Felsti Felsti ist offline Mitglied
    Registriert seit
    Apr 2005
    Beiträge
    24
    So, als Nachtrag wie der richtige Code gelautet hätte

    Code :
    1
    2
    3
    4
    5
    
    PWSTR input;
    cout<<"Usernamen eingeben:\n";
    wscanf( L"%ls", input);
    PWSTR wszGroupID2 = input;
    wprintf( L"%s\n", wszGroupID2);

    ...manchmal ist es einfacher als man denkt, denn wscanf und wprintf waren die Lösung

    Ich danke trotzdem für die nette Unterstützung!
     

  14. #14
    Registriert seit
    Apr 2002
    Ort
    Delmenhorst (Niedersachsen)
    Beiträge
    3.567
    moin


    Warum liesst du nciht gleich in wszGroupID2 ein?
    Ist doch Speicherverschwendung wie du es machst.


    mfg
    umbrasaxum
     

  15. #15
    Avatar von Endurion
    Endurion Endurion ist offline Mitglied Diamant
    Registriert seit
    Apr 2004
    Beiträge
    2.151
    Initialisierst du den Pointer irgendwo auf einen gültigen Bereich? Wenn nicht, dann hast du wahnsinnig viel Glück und das Ding explodiert dir dann, wenn du es am wenigsten erwartest. Ändere es zumindest so ab:

    Code :
    1
    2
    3
    4
    5
    6
    
    WCHAR   wInput[200];
    PWSTR input = &wInput;
    cout<<"Usernamen eingeben:\n";
    wscanf( L"%ls", input);
    PWSTR wszGroupID2 = input;
    wprintf( L"%s\n", wszGroupID2);
     

Ähnliche Themen

  1. Ant Benutzereingabe
    Von Eichi im Forum Java Grundlagen
    Antworten: 1
    Letzter Beitrag: 21.01.11, 13:11
  2. concat PWSTR und Strings
    Von StehtimSchilf im Forum C/C++
    Antworten: 10
    Letzter Beitrag: 06.05.10, 18:13
  3. PWSTR nach jstring konvertieren?
    Von zu1u im Forum C/C++
    Antworten: 4
    Letzter Beitrag: 14.05.09, 23:05
  4. Benutzereingabe in Textfeld tun
    Von i-mehl im Forum Javascript & Ajax
    Antworten: 5
    Letzter Beitrag: 29.02.04, 12:09
  5. Benutzereingabe
    Von gEr|Steven im Forum Javascript & Ajax
    Antworten: 9
    Letzter Beitrag: 18.04.02, 19:19