In LPCWSTR speichern?
-
Hallo Forum
ich arbeite an einem Programm der als Geplanter Task gespeichert werden kann(oder soll). Jetzt hab ich ein Problem den Task zu speichern weil der Programmname mit den "" gespeichert wird, dadurch kann der Taskmanager Ihn nicht finden weil es z.Bsp. ein "C:\Windows\notepad.exe" nicht gibt, aber ein C:\Windows\notepad.exe schon!
LPCWSTR m_lProgrammName = L"C:\Windows\notepad.exe"; hr = pITask->SetApplicationName(m_lProgrammName);
Im Taskmanager steht jetzt der gesammte String mit den Anführungszeichen, ohne die funktioniert es Einwandfrei!
Kann ich die wegmachen, sowas wie Trim Funktion hab ich probiert aber ich komme nicht ganz zu Recht mit Ihr!
Danke
Mirsad
-
Es wäre mal ein Anfang, die Backslashes zu korrigieren.
-
Oh sorry, die sind natürlich so:
LPCWSTR m_lProgrammName; m_lProgrammName = L"C:\\Windows\\notepad.exe C:\\TestDatei.txt"; // Anwendung zum ausführen festlegen hr = pITask->SetApplicationName(m_lProgrammName);
danke
mirsad
-
Keine Ahnung, von C++ aus enthält der String ja keine Anführungszeichen, die müssen erst irgendwo in der Funktion dazukommen.
-
Ich habs auch so versucht:
// erst einen CString bilden CString str = "C:\\Windows\\notepad.exe C:\\TestDatei.txt" ; // aus dem dann mit Trim die "" löschen str.Trim("\""); // und dann zum LPCWSTR umwandeln, aber genau da hängt es wieder m_lProgrammName = LPCWSTR(str); // diese Fehlermeldung // c:\..\..\..\Visual Studio Projects\task\taskDlg.cpp(308): error C2440: 'type cast' : cannot convert from 'CString' to 'const WCHAR *' // das hinzubekommen würde heisen das der Task richtig erstellt wird! // Anwendung zum ausführen festlegen hr = pITask->SetApplicationName(m_lProgrammName); // pITask->SetApplicationName(LPCWSTR m_lProgrammName) akzeptiert nur LPCWSTR // als Parameter
mfg
Mirsad
-
m_lProgrammname = (LPCTSTR)str;
Damit hättest du schonmal nen LPCWSTR wenn Unicode definiert ist, ansonsten einen LPCSTR.
-
Hallo alien
läuft auch nicht leider, Fehler der ausgegeben wird:
c:\Dokumente und Einstellungen\Anwender\Eigene Dateien\Visual Studio Projects\task\taskDlg.cpp(260): error C2440: '=' : cannot convert from 'ATL::ChTraitsBase<BaseType>::PCXSTR' to 'LPCWSTR'
with
[
BaseType=TCHAR
]dann hab ich so versucht(der Programmname soll später aus einem Eingabefeld kommen):
CString theString( "C:\\Windows\\notepad.exe C:\\TestDatei.txt" ); theString.Trim("\""); LPTSTR lpsz = new TCHAR[theString.GetLength()+1]; _tcscpy(lpsz, theString); m_lProgrammName = (LPCTSTR)theString; // Anwendung zum ausführen festlegen hr = pITask->SetApplicationName(m_lProgrammName);
danke für deine Antwort
mirsad
-
ähm, wie kann ich denn unicode einstellen oder aktivieren?
mfg
mirsad
-
Mirsad schrieb:
CString theString( "C:\\Windows\\notepad.exe C:\\TestDatei.txt" ); theString.Trim("\""); LPTSTR lpsz = new TCHAR[theString.GetLength()+1]; _tcscpy(lpsz, theString); m_lProgrammName = (LPCTSTR)theString; // Anwendung zum ausführen festlegen hr = pITask->SetApplicationName(m_lProgrammName);
Das theString.Trim("\""); macht wenig Sinn, da in theString sicher keine " gespeichert sind. Sie müssen also irgendwo anders hinzugefügt werden. Wenn du dir nicht sicher bist, benutze mal den Debugger.
Das erste und letzte Zeichen wegschneiden geht übrigends ganz einfach.
Z.B. sotheString = theString.Mid(1); theString = theString.Left(theString.GetLength()-1);
Grüße Rapha
-
Über Unicode findest du in der MSDN einiges:
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_international_enabling.asp
http://msdn.microsoft.com/library/deu/default.asp?url=/library/DEU/vccore/html/_core_unicode_topics.asp
-
Versuch doch mal einfach:
LPCWSTR foo; foo = (LPCWSTR)(LPCTSTR)theString;
Lässt sich bei mir ohne Probleme compilieren. Obs Probleme macht hinterher kann ich dir nicht sagen.
-
Hallo Rapha
danke für den link, bin gerade dabei mir mehr Infos zu holen über dieses Thema!
mfg
Mirsad
-
hab jetzt gefunden woran es lag, aber nicht warum!
hier nochmal als beispiel:
LPCWSTR m_lProgrammName; m_lProgrammName = L"C:\\Windows\\notepad.exe C:\\TestDatei.txt"; // Fehlerzeile // kein Fehler: m_lProgrammName = L"C:\\Windows\\notepad.exe"; // kein Fehler, aber notepad ohne parameter C:\\TestDatei.txt // Anwendung zum ausführen festlegen hr = pITask->SetApplicationName(m_lProgrammName);
Warum speichert er die erste Zeile falsch aber die untere richtig???
mfg
mirsad
-
Vielleicht weil ein Leerzeichen drin ist?
-
ok, hab mein fehler gefunden, die ITask Klasse hat auch eine Funktion SetParameter, also SetApplicatonName und SetParameter müssen getrennt gesetzt werden, ich wollte natürlich alles ins eine stecken:
Falsch:
LPCWSTR = m_lProgrammName; m_lProgrammName = L"C:\\Windows\\notepad.exe C:\\TestDatei.txt"; hr = pITask->SetApplicationName(m_lProgrammName);
Richtig:
LPCWSTR m_lProgrammName; LPCWSTR m_sDatei; m_lProgrammName = L"C:\\Windows\\notepad.exe"; m_sDatei = L"C:\\TestDatei.txt"; // Parameter muß dem Programm separat zugewisen werden // Anwendung zum ausführen festlegen hr = pITask->SetApplicationName(m_lProgrammName); pITask->SetParameters(m_sDatei); // Optional if(FAILED(hr)) { MessageBox("Fehler bei Speichern der auszuführenden Anwendung!","Fehler", MB_OK); CoUninitialize(); }
Der Consolenbefehl lautet neben bei gesagt so:
C:\notepad C:\TestDatei.txt
Da war vieleicht mein Fehler das ich gedacht habe das es das selbe ist im Programmieren und Console!
Stellt sich noch die Frage wie kann ich in aus dem Textfeld in die LPCWSTR speichern???aber das mit dem Textfeld, da brauche ich Hilfe!
mfg
mirsad
-
Mirsad schrieb:
Stellt sich noch die Frage wie kann ich in aus dem Textfeld in die LPCWSTR speichern???
aber das mit dem Textfeld, da brauche ich Hilfe!
mfg
mirsadProbier mal die Casts die ich weiter oben geschrieben habe.
-
the_alien schrieb:
Mirsad schrieb:
Stellt sich noch die Frage wie kann ich in aus dem Textfeld in die LPCWSTR speichern???
aber das mit dem Textfeld, da brauche ich Hilfe!
mfg
mirsadProbier mal die Casts die ich weiter oben geschrieben habe.
Nein. Bitte nicht.
-
Hallo Forum
the_alien schrieb:
Versuch doch mal einfach:
LPCWSTR foo; foo = (LPCWSTR)(LPCTSTR)theString;
Lässt sich bei mir ohne Probleme compilieren. Obs Probleme macht hinterher kann ich dir nicht sagen.
ich habs natürlich probiert,
, leider auch nicht mit erfolg, ich hab dann so gemacht:
BSTR bstr; // umweg über BSTR CString cstr="TaskName"; LPCWSTR m_pwszTaskName; bstr = cstr.AllocSysString(); m_pwszTaskName = (LPCWSTR) bstr; // Jetzt kann der Task name aus der EDIT Box ausgelesen werden und als LPCWSTR auch gespeichert werden hr = pITS->NewWorkItem(m_pwszTaskName,CLSID_CTask, IID_ITask, (IUnknown**) &pITask); pITS->Release();
Bessere Idee hatte ich nicht, aber es funktioniert auch so!
mfg
Mirsad