Externes Programm starten



  • Extras --> Optionen --> Verzeichnisse

    "Include" und "Bibliothekdateien", da sollten die Ordner vom PSDK ganz oben in der Liste stehen...



  • MMmmmmm ich schon wieder....

    habe jetzt verschiedene Verzeichnisse ausprobiert.
    Keine Besserung.

    Habe die CAB Files heruntergeladen,
    diese in ein Verzeichniss geteckt c:\temp\sdk
    dort entpackt nach c:\psdktemp
    dann verschoben nach c:\install\sdk
    dort habe ich setup aufgerufen, was mir obiges resultat gebracht hat.
    anschließend stand unter c:\programme\microsoft sdk\.....

    welches Verzeichnis jetzt genau ??

    Ich krige es nicht hin.....

    Gruß
    andy_mann



  • Include Dateien:
    C:\Programme\Microsoft SDK\include

    Bibliothekdateien:
    C:\Programme\Microsoft SDK\lib



  • hmmmm..

    jetzt gibt es noch mehr fehler....
    und
    CreateProcessWithLogonW
    ist immernoch dabei...

    error C2061: Syntaxfehler : Bezeichner 'DWORD_PTR'
    error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'Key'
    error C2501: 'ULONG_PTR' : Fehlende Speicherklasse oder Typbezeichner
    error C2501: 'Key' : Fehlende Speicherklasse oder Typbezeichner
    error C2061: Syntaxfehler : Bezeichner 'DWORD_PTR'
    error C2440: 'initializing' : 'char [12]' kann nicht in 'unsigned short []' konvertiert werden
    Es gibt keinen Kontext, in dem diese Konvertierung moeglich ist
    error C2065: 'CreateProcessWithLogonW' : nichtdeklarierter Bezeichner
    error C2065: 'LOGON_WITH_PROFILE' : nichtdeklarierter Bezeichner

    Muß ich es so langsam auf geben ;-((

    Gruß
    andy_mann



  • Kannst Du mal deinen Code kurz posten, mit Kommentaren, die zeigen in welcher Zeile welcher Fehler kommt?



  • Also erst mal vielen Dank für dein Bemühen......

    ich hoffe nicht dass ich jetzt komplett auf dem Holzweg bin, ich habe nähmlich ein Projekt im konsolenmodus und MFC unterstützung erstellt....

    Trotzdem hier der Source.....

    // RegeditSearch.cpp : Definiert den Einsprungpunkt für die Konsolenanwendung.
    //
    
    #define _WIN32_WINNT 0x0500 
    #include "stdafx.h"
    #include <windows.h>
    #include <tchar.h> 
    
    #include "RegeditSearch.h"
    #include "Meldung.h"
    #include "Daten.h"
    
    #include <iostream> 
    #include <string>
    
    #include "Util.h"
    
    #ifdef _DEBUG
    #define new DEBUG_NEW
    #undef THIS_FILE
    static char THIS_FILE[] = __FILE__;
    #endif
    
    /////////////////////////////////////////////////////////////////////////////
    // Das einzige Anwendungsobjekt
    
    CWinApp theApp;
    
    using namespace std;
    
    int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
    {
    	int nRetCode = 0;
    
    	// MFC initialisieren, Ausgabe und Fehlermeldung bei Fehlern
    	if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
    	{
    		// ZU ERLEDIGEN: Fehlercode gemäß Ihren Anforderungen ändern
    		cerr << _T("Fatal Error: MFC initialization failed") << endl;
    		nRetCode = 1;
    	}
    	else
    	{
    		// ZU ERLEDIGEN: Anwendungsverhalten hier festlegen.
    		/* CString strHello;
    		strHello.LoadString(IDS_HELLO);
    		cout << (const TCHAR*)strHello << endl; */
    
    		CDaten m_cDaten;
    
    		std::string m_strBetreff;
    
    		char buffer[20480];
    
    		char EinPfad2[500];
    		DWORD destSize2; 
    		destSize2=500;
    
    		std::string m_strErgebnis;
    
    		std::string Schluessel;
    		std::string SchluesselPfad;
    		std::string SchluesselPfad2;
    		std::string SchluesselName;
    		std::string SchluesselWert;
    		std::string SchluesselProgramm;
    
    		std::string m_strStartProgramm;
    
    		GetPrivateProfileSection("Such Objekt",buffer, sizeof(buffer),m_cDaten.getIniPfad().c_str()); 
    
    		char *pBuffer = buffer;
    
    		while(strlen(pBuffer) != 0) 
    		{ 
    			// std::cout << pBuffer << std::endl; 
    
    			Schluessel = CUtil::WortStelleZeille(pBuffer,0,1,';');
    			SchluesselPfad = CUtil::WortStelleZeille(pBuffer,1,2,';');
    			SchluesselName = CUtil::WortStelleZeille(pBuffer,2,3,';');
    			SchluesselWert = CUtil::WortStelleZeille(pBuffer,3,4,';');
    			SchluesselProgramm = CUtil::WortStelleZeille(pBuffer,4,5,';');
    
    			SchluesselPfad2 = CUtil::PfadInProgrammPfad(SchluesselPfad);
    
    			m_strErgebnis = CUtil::RegeditSearch(Schluessel, SchluesselPfad, SchluesselName);
    
    			if(m_strErgebnis == "-1000")
    			{
    				m_strBetreff = "";
    				m_strBetreff = "Installation entspricht nicht der aktuellen Version\n\nUpdate wird durchgeführt.... ";
    				// MessageBox(NULL, TEXT(m_strBetreff.c_str()), TEXT("Meldung"), 0);
    				CMeldung *Dialog = new CMeldung();
    				Dialog->Create(IDD_MELDUNG, NULL);		
    				Dialog->CenterWindow(); 
    				Dialog->ShowWindow(SW_SHOW);
    				Dialog->RedrawWindow();
    				Dialog->setText(m_strBetreff);
    				Sleep(1000);
    				Dialog->DestroyWindow();
    
    				GetPrivateProfileString("Programm Start",SchluesselProgramm.c_str(),"NULL",EinPfad2,destSize2,m_cDaten.getIniPfad().c_str());
    				std::string m_strEinPfad2 = EinPfad2;
    				m_strStartProgramm =  m_strEinPfad2 + " " + CUtil::KurzformSchluessel(Schluessel) + " " +  SchluesselPfad + " " + SchluesselName + " 0 " + SchluesselWert;
    				system(m_strStartProgramm.c_str());
    
    				return nRetCode;
    			}
    			else
    			if(m_strErgebnis == "-2000")
    			{
    				// Hier komme ich hin, wenn er Durchgelaufen ist oder er nichts findet.
    				return nRetCode;
    			}
    			else
    			if(m_strErgebnis != SchluesselWert)
    			{
    				m_strBetreff = "";
    				m_strBetreff = "Installation entspricht nicht der aktuellen Version\n\nUpdate wird durchgeführt.... ";
    
    				CMeldung *Dialog = new CMeldung();
    				Dialog->Create(IDD_MELDUNG, NULL);		
    				Dialog->CenterWindow(); 
    				Dialog->ShowWindow(SW_SHOW);
    				Dialog->RedrawWindow();
    				Dialog->setText(m_strBetreff);
    				Sleep(1000);
    				Dialog->DestroyWindow();
    
    				GetPrivateProfileString("Programm Start",SchluesselProgramm.c_str(),"NULL",EinPfad2,destSize2,m_cDaten.getIniPfad().c_str());
    				std::string m_strEinPfad2 = EinPfad2;
    
    				m_strStartProgramm =  m_strEinPfad2 + " " + CUtil::KurzformSchluessel(Schluessel) + " " +  SchluesselPfad + " " + SchluesselName + " " + m_strErgebnis + " " + SchluesselWert;
    
    				// Hier rufe ich mein externes Programm auf..., aber ohne admin rechte......
    				// system(m_strStartProgramm.c_str());
    
    				STARTUPINFO si; 
    				PROCESS_INFORMATION pi; 
    
    				memset(&si, 0, sizeof(si)); 
    				memset(&pi, 0, sizeof(pi)); 
    				si.cb = sizeof(si); 
    
    				// ------ Hier kommt mein Problem.......
    
    				WCHAR szCommandLine[] = _T("notepad.exe"); // Darf nicht const sein!!! 
    				if(!CreateProcessWithLogonW(_T("testaccount"), _T("."), _T("hallo"), LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi)) 
    				// Der Punkt beim Parameter 2 bedeutet, das die lokale Benutzerdatenbank verwendet werden soll. 
    				{ 
    					LPVOID lpMsgBuf; 
    					FormatMessage( 
    						FORMAT_MESSAGE_ALLOCATE_BUFFER | 
    						FORMAT_MESSAGE_FROM_SYSTEM | 
    						FORMAT_MESSAGE_IGNORE_INSERTS, 
    						NULL, 
    						GetLastError(), 
    						MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
    						(LPTSTR) &lpMsgBuf, 
    						0, 
    						NULL 
    					); 
    					MessageBox(NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONEXCLAMATION); 
    					LocalFree(lpMsgBuf); 
    					// Bei Fehlermeldung: "Der angegebene Dienst kann nicht gestartet werden..." 
    					// überprüfe ob der Dienst "Sekundäre Anmeldung" aktiviert und gestartet ist! 
    				} 
    
    				CloseHandle(pi.hProcess); 
    				CloseHandle(pi.hThread); 
    
    				// ------ Hier endet mein Problem......
    
    				return nRetCode;
    
    			}
    
    			Schluessel= "";
    			SchluesselPfad = "";
    			SchluesselName = "";
    			SchluesselWert = "";
    			SchluesselProgramm = "";
    
    			pBuffer += strlen(pBuffer) + 1; 
    		} 	
    
    	}
    
    	return nRetCode;
    }
    

    Gruß
    andy_mann



  • Du hast Dein Projekt aber als UNICODE eingestellt, oder?



  • Hmmm...

    bin ich mir nicht sicher,
    habe einfach den Asistenten von VS 6.0 folge geleistet.
    Und anschließend meinen Code hinzu gefügt.

    Ohne dem Markierten Beriech tut es ja.

    Nur nicht mit besonderen Rechten..

    GRuß
    andy_mann



  • Also, ich habe es jetzt mal anders herum gemacht,

    habe ein Projekt in Win32 Consolen Modus erstellt.

    Habe nur den Source von vorigem Beispiel eingehängt:

    /* Einbinden der Advapi32.lib nicht vergessen!!! */ 
    
    #define _WIN32_WINNT 0x0500 
    #include <windows.h> 
    #include <tchar.h> 
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
    { 
        STARTUPINFO si; 
        PROCESS_INFORMATION pi; 
    
        memset(&si, 0, sizeof(si)); 
        memset(&pi, 0, sizeof(pi)); 
        si.cb = sizeof(si); 
    
        WCHAR szCommandLine = _T("notepad.exe"); // Darf nicht const sein!!!
        if(!CreateProcessWithLogonW(_T("testaccount"), _T("."), _T("hallo"), LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi)) 
        // Der Punkt beim Parameter 2 bedeutet, das die lokale Benutzerdatenbank verwendet werden soll. 
        { 
            LPVOID lpMsgBuf; 
            FormatMessage( 
                FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                FORMAT_MESSAGE_FROM_SYSTEM | 
                FORMAT_MESSAGE_IGNORE_INSERTS, 
                NULL, 
                GetLastError(), 
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
                (LPTSTR) &lpMsgBuf, 
                0, 
                NULL 
            ); 
            MessageBox(NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONEXCLAMATION); 
            LocalFree(lpMsgBuf); 
            // Bei Fehlermeldung: "Der angegebene Dienst kann nicht gestartet werden..." 
            // überprüfe ob der Dienst "Sekundäre Anmeldung" aktiviert und gestartet ist! 
        } 
    
        CloseHandle(pi.hProcess); 
        CloseHandle(pi.hThread); 
        return 0; 
    }
    

    CreateProcessWithLogonW scheint er zu kennen, allerdings gibt es noch 2 Fehler:
    error C2440: 'initializing' : 'char [12]' kann nicht in 'unsigned short' konvertiert werden
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    D:\vcpp32\dieter\test\main.cpp(17) : error C2664: 'CreateProcessWithLogonW' : Konvertierung des Parameters 1 von 'char [12]' in 'const unsigned short *' nicht moeglich
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Mit der Meldung fange ich jetzt nichts an..

    Kann mir jemand Helfen ??

    Gruß
    andy_mann



  • Wenn du einen Unicode-String brauchst kannst du einfach ein L davorsetzen - also so:

    L"testaccount"
    


  • Hall,

    also Danke Dir,
    aber wohin ich auch das L setze, immer der selbe Fehler.. 😢

    Gruß
    andy_mann



  • Dann scheinst du etwas falsch gemacht zu haben - zeig doch bitte nochmal deinen Code 🕶



  • Ich Danke DIr,

    /* Einbinden der Advapi32.lib nicht vergessen!!! */ 
    
    #define _WIN32_WINNT 0x0500 
    #include <windows.h> 
    #include <tchar.h> 
    
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) 
    { 
        STARTUPINFO si; 
        PROCESS_INFORMATION pi; 
    
        memset(&si, 0, sizeof(si)); 
        memset(&pi, 0, sizeof(pi)); 
        si.cb = sizeof(si); 
    
        WCHAR szCommandLine = _T("notepad.exe"); // Darf nicht const sein!!!
        if(!CreateProcessWithLogonW(_T("testaccount"), _T("."), _T("hallo"), LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi)) 
        // Der Punkt beim Parameter 2 bedeutet, das die lokale Benutzerdatenbank verwendet werden soll. 
        { 
            LPVOID lpMsgBuf; 
            FormatMessage( 
                FORMAT_MESSAGE_ALLOCATE_BUFFER | 
                FORMAT_MESSAGE_FROM_SYSTEM | 
                FORMAT_MESSAGE_IGNORE_INSERTS, 
                NULL, 
                GetLastError(), 
                MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), 
                (LPTSTR) &lpMsgBuf, 
                0, 
                NULL 
            ); 
            MessageBox(NULL, (LPCTSTR)lpMsgBuf, NULL, MB_OK | MB_ICONEXCLAMATION); 
            LocalFree(lpMsgBuf); 
            // Bei Fehlermeldung: "Der angegebene Dienst kann nicht gestartet werden..." 
            // überprüfe ob der Dienst "Sekundäre Anmeldung" aktiviert und gestartet ist! 
        } 
    
        CloseHandle(pi.hProcess); 
        CloseHandle(pi.hThread); 
        return 0; 
    }
    

    Gruß
    andy_mann



  • Dann mach daraus jetzt mal folgendes:

    WCHAR szCommandLine = L"notepad.exe"; // Darf nicht const sein!!! 
        if(!CreateProcessWithLogonW(L"testaccount", L".", L"hallo", LOGON_WITH_PROFILE, NULL, szCommandLine, NULL, NULL, NULL, &si, &pi))
    [...]
    


  • MMhhhh..

    Danke Dir,
    aber was soll ich Dir Schreiben 😢

    Immerhin sind es jetzt nur noch 2 Fehler.....

    main.cpp(16) : error C2440: 'initializing' : 'unsigned short [12]' kann nicht in 'unsigned short' konvertiert werden
    Diese Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat
    main.cpp(17) : error C2664: 'CreateProcessWithLogonW' : Konvertierung des Parameters 6 von 'unsigned short' in 'unsigned short *' nicht moeglich
    Die Konvertierung eines ganzzahligen Typs in einen Zeigertyp erfordert ein reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Gruß
    andy_mann



  • Hallo,

    naja, dann korrigierst du die (hoffentlich) letzte falsche Zeile auch noch:

    // darf nicht nur ein WCHAR sein, sondern ein WCHAR* !!!
    WCHAR szCommandLine[] = L"notepad.exe"; // Darf nicht const sein!!!
    

    MfG



  • War mir vorhin gar nicht aufgefallen 😮 😉



  • Oooohhhh...
    ich danke Dir,

    allerdings noch ein Fehler...

    main.cpp(17) : error C2664: 'CreateProcessWithLogonW' : Konvertierung des Parameters 10 von 'struct _STARTUPINFOA *' in 'struct _STARTUPINFOW *' nicht moeglich
    Die Typen, auf die verwiesen wird, sind nicht verwandt; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat

    Gruß
    andy_mann



  • genau deswegen ist es sinnvoll, doch mit UNICODE zu kompilieren, aber wenn wir schon soweit sind: auch die STARTUPINFO-Struktur muß dann in der UNICODE-Version deklariert werden:

    STARTUPINFOW si;
    

    aber jetzt...(vielleicht ist es auch sinnvoll, die STARTUPINFOW wenigstens in einigen Positionen zu besetzen)

    MfG



  • Hallo,

    das ist mir jetzt ja schon peinlich....
    ist nicht so, dass ich noch nie was gemacht habe....

    aber bei diesem Source ???????????????????????????????????

    Kompilieren geht durch, 0 Fehler...
    Linker:

    LIBCD.lib(crt0.obj) : error LNK2001: Nichtaufgeloestes externes Symbol _main
    Debug/test.exe : fatal error LNK1120: 1 unaufgeloeste externe Verweise

    GRuß
    andy_mann


Anmelden zum Antworten