CString in LPCSTR



  • Hallo Leute,
    ich hab ein einfaches Problem: Wie konvertiere ich einen CString in einen LPCSTR?????????? Geht bestimmt ganz einfach, muss man nur wissen.



  • Gleich noch nen Nachtrag. Wie kann man den Werte in ein String-Table (Ressource) laden?



  • Hm, LPCSTR ist konstant, also müsste das gehen:

    CString str = "Hallo, mein Name ist String"; // mir ist grad nichts besseres eingefallen
    LPCSTR pStr = (LPCSTR) str; // LPCSTR = (const char*) wenn ich mich nicht irre
    

    Grüße Rapha

    [edit]Sorry LPCSTR* ist doppeltgemoppelt 🙂 habs korrigiert[/edit]



  • Hallo Cloop,

    CString hat folgende Eigenschaften:

    a) CString implementiert eine dynamische Speicherverwaltung
    b) Eine Reihe von komfortablen Operatoren und Funktionen zur Bearbeitung von Strings
    c) CString besitzt einen Operator, der einen konstanten, NULL-terminierten CString (LPCTSTR). Damit lassen sich CString-Objekte direkt an Windows-API-Funktionen übergeben.

    Beispiel:

    LPCSTR a;
    CString s="Hallo";
    a=s;
    AfxMessageBox(a);
    

    Gruß

    Chris



  • LoadString 😉



  • CString PageNames; /*...*/
    CPropertyPage* m_pPage1 = new /*...*/
    m_pPage1->m_psp.pszTitle = (LPCSTR) PageNames.Left(PageNames.Find('*')) ;
    

    PropertyPages haben ein m_psp, eine PROPSHEETPAGE-Struktur. Mit

    m_psp.pszTitle="Seite 1"
    

    klappt es ganz einfach, aber alles andere scheitert.

    (LPCSTR)
    

    ,

    (LPCSTR)(LPCTSTR)
    

    ,

    (const char*)
    

    , etc., ich hab schon alles kontrolliert mit dem Debugger. Vielleicht sollte ich mal einen TypeCast probieren.
    @Rapha: Das interessante wäre ja, zur Laufzeit einen String in eine resource zu packen und dann da abzuspeichern (öh, Traum). Ich such immer noch nach einer richtigen Möglichkeit, ein Probeversion eines Programmes zu verteilen, dass dann aber wirklich nur 1 Monat läuft, oder nur 50 Mal oder so, ohne die Merkwerte in einer externen Datei abzuspeichern. Da würde sich eine String-Resource anbieten. Es da rauszulesen ist nicht so schwer, zur Laufzeit da was reinzubekommen dürfte interessanter sein.

    Mfg



  • Hallo nochmal,
    ihr habt schon recht, in der MSDN steht folgendes:

    m_strCaption.Format("%S", pPPI->pszTitle);
    m_psp.pszTitle = m_strCaption;
    

    Möchte mal wissen, warum das dann bei mir nicht klappt 😕



  • Weil die CString-Instanz, die von Left zurückgegeben wird, gleich wieder zerstört wird, weil du sie niemandem zuweist. Dadurch wird der vom Konvertierungsoperator zurückgegebene Zeiger ungültig.



  • Hallo MFK,
    ja, du hast recht gehabt, ich mußte tatsächlich im PropertySheet ne Member anlegen für die Page um das pszTitle "am Leben zu halten". Vielen Dank.



  • @CLoop

    Du willst Stringinformationen in einer Exe-Datei speichern? Kein Problem.
    1. Möglichkeit: am Ende der Datei (gleiche Lösung wie Viren sie verwenden)
    Schreiben:
    Du erstellst eine Kopie der gestarteten exe-Datei (da die gestartete Exe-Datei ja schreibgeschützt ist), öffnest diese, setzt den Dateizeiger ans Ende, schreibst deinen String (char*) und hängst ganz ans Ende der Datei eine Art Signatur an, z.B. so eine:

    struct sigatur
    {
    char Signatur[5]; // eine 5-Stellige Signatur (z.b. "XXXXX", "12345", "odsfja", "hallo"), anhand der du feststellen kannst, ob Informationen an die Datei angehängt wurden
    int AnzahlBytes; // wieviel Bytes hat der angehängte String (vor der Signatur)
    

    Lesen:
    Du öffnest dich selber (darfst du ja, da du ja nicht schreiben willst). Dann setzt du den Lesezeiger an das (Ende der Datei) - (sizeof(struct signatur)) und liest die Bytes (Länge: sizeof(struct signatur)) ein.
    Dann vergleichst du den Inhalt von (struct signatur)::Signatur (die Struct, die du eingelesen hast) und vergleichst ihn mit dem Signaturstring, den du vorher festgelegt hast (z.b. "XXXXX", "12345", "odsfja", "hallo").
    Wenn er übereinstimmt, sind Stringinformationen vorhanden, JUHU.
    Dann setzt du den Dateizeiger auf folgende Position (angenommen die Variable s vom Typ signatur ist die Variable, die du (erfolgreich) eingelesen hast):
    (Größe der exe-Datei)-(sizeof(struct signatur))-(s.AnzahlBytes)
    und liest genau s.AnzahlBytes Bytes in ein char Array ein.
    Dann hast du deine Stringinformationen in diesem char Array!!!

    2. Möglichkeit: Speichern in den Ressourcen
    Lesen:
    LoadString
    Schreiben:
    -Kopie von der eigenen exe-Datei herstellen (da man auf die eigene Datei ja keine Schreibrechte hat)
    -Die kopierte exe-Datei mit LoadLibrary öffnen
    -Die String Ressource mit FindRessource finden
    -Einen Pointer auf die String-Ressource mit LockRessource erhalten
    -BeginUpdateResource aufrufen
    -Die Ressource mit UpdateResource bearbeiten
    -Das Bearbeiten der Ressource mit EndUpdateResource beenden
    Beispiel in der MSDN: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/Resources/IntroductiontoResources/UsingResources.asp

    Grüße Rapha



  • Hi
    @Rapha

    Is ja super,
    die zweite Möglichkeit hatte ich auch in der MSDN gefunden, die erste aber kenne ich gar nicht.
    Die zweite gefällt mir besser. Ich muss mir noch einiges überlegen, das scheint aber ungeahnte Möglichkeiten zu eröffnen! :p 😉 😃


Anmelden zum Antworten