Typumwandlung strin->LPSTR



  • Hallo,

    ich schreibe ein Programm welches ein anderes Programm aufruft. Den Pfad diese Programms erhalte ich aus einer cfg.
    CreateProcess erwartet den Pfad allerdings als LPSTR.
    Die Umwandlung klappt leider nicht. Schaut es euch mal an und sagt mir bitte wie es richtig geht.

    Danke
    Erion
    #include "stdafx.h"
    #include "windows.h"
    #include <string>
    #include <iostream>
    #include <fstream>
    #include <stdio.h>

    using namespace std;

    void fehler ()
    {
    fstream ausgabestrom;//Daten schreiben
    DWORD msglen, ErrorCode;
    LPSTR msgBuf;
    string errorMeldung;
    ErrorCode = GetLastError();
    msglen = FormatMessage (FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM, NULL, ErrorCode ,MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT),(LPTSTR) &msgBuf, 0, NULL);
    msgBuf [msglen] = TEXT('\0');
    errorMeldung=msgBuf;
    LocalFree (msgBuf);

    ausgabestrom.open("guardianerror.log",ios::out|ios::app);
    ausgabestrom<<errorMeldung;
    ausgabestrom.close();

    return;
    }

    void datenEinlesen(string &fPfadDateiMailer, unsigned long &fTimetosleep, string &fPfadErrorlog )
    {
    fstream dateistrom;
    dateistrom.open("guardian.cfg",ios::out|ios::app);
    dateistrom.close();

    fstream eingabestrom; //Daten lesen
    eingabestrom.open("guardian.cfg",ios::in);

    eingabestrom>>fPfadDateiMailer>>fTimetosleep>>fPfadErrorlog;
    return;
    }

    void main(int argc, char* argv[])
    {
    BOOL ret;
    STARTUPINFO startupInfo;
    GetStartupInfo (& startupInfo);
    PROCESS_INFORMATION processInfo;
    string pfadDateiMailer;
    string pfadErrorlog;
    unsigned long timetosleep;

    datenEinlesen(pfadDateiMailer, timetosleep, pfadErrorlog);

    while (1) // unendlich
    {
    string *castToPointerString;
    LPSTR castToLPSTR;
    castToPointerString = &pfadDateiMailer; //pointer zeigt nun auf string
    cout<<*castToPointerString<<&castToPointerString <<endl;
    castToLPSTR = (LPSTR)&castToPointerString; // castToLPSTR zeigt auf string
    cout <<&castToLPSTR<<endl;// wie man sieht stimmen die Adressen nicht( um 32 bit verschoben?)

    ret = CreateProcess (NULL, castToLPSTR ,NULL, NULL, 0, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);

    if(ret==false)
    {
    fehler();
    }
    Sleep(timetosleep); // 360000 ms = 360 sec = 60 min = 1h -> Guardian schläft eine h
    }
    ret = CloseHandle(processInfo.hThread);

    if (ret == false)
    {
    //fehler();
    }

    ExitProcess(0);
    };



  • TheString.c_str()



  • Hallo,

    das hat mir nicht wirklich weitergeholfen, war aber sehr schnell 🙂 .
    Ich habe die Zeile

    castToLPSTR = (LPSTR)&castToPointerString;

    durch
    castToLPSTR = pfadDateiMailer.c_str();

    Dies brachte jedoch keinen Erfolg.
    Eine genauere Erklärung wäre besser.

    Danke
    Erion



  • Jo, stimmt, c_str() gibt einen LPCSTR zurück. Also arbeite mit LPCSTR wenn's geht



  • Jo, CreateProcess erwartet aber einen LPSTR
    jedoch kann man einen LPCSTR nach LPSTR casten und siehe das es geht :-).

    castToLPCSTR = pfadDateiMailer.c_str ();
    castToLPSTR =(LPSTR)castToLPCSTR;

    ret = CreateProcess (NULL, castToLPSTR ,NULL, NULL, 0, CREATE_NEW_CONSOLE, NULL, NULL, &startupInfo, &processInfo);

    Danke
    Erion


Anmelden zum Antworten