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 ZeilecastToLPSTR = (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