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. so

    theString = theString.Mid(1);
    theString = theString.Left(theString.GetLength()-1);
    

    Grüße Rapha





  • 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
    mirsad

    Probier 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
    mirsad

    Probier 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


Anmelden zum Antworten