Tool für mobile Geräte



  • Hallo,

    keine Ahnung ob ich hier richtig bin, weis aber auch leider nicht so richtig wonach ich suchen muss; ihr werdet mich sicher belehren 🙂

    Ich mache zurzeit eine Ausbildung zum Fachinformatiker für Anwendungsentwicklung, habe aber nur geringe Kenntnisse in Java und C#.net, was wir auch in der Firma benutzen.

    Jetzt soll ich aber ein Tool schreiben, welches auf einem „mobilen Gerät“ MDA mit WindowsMobile2003 ohne .net läuft. Dieses Programm soll Automatisch anhand einiger Registry-Einträge bestimmte CAB-Dateien ausführen/entpacken, unter anderem auch das .net Framework. Ist quasi so eine Installation die nach einem „Hard-Reset“ eines MDAs automatisch ausgeführt werden soll. Habe das Programm ich C# fertig aber das läuft ja nicht ohne das .net was nach einem „Hard-Reset“ nicht mehr drauf ist. Deswegen soll ich das Programm in c++ schreiben.

    Ich hoffe ihr habt das soweit verstanden 🙂

    Biss jetzt habe ich folgenden Code der aber leider Fehler aufweist bzw. nicht das tut was ich will.

    int _tmain(int argc, _TCHAR* argv[])
    {         
    	SHELLEXECUTEINFO sei            = {0};
    
    	// Execute the file.
        sei.cbSize = sizeof(SHELLEXECUTEINFO);
    	sei.lpFile  = (LPTSTR)"\\Storage Card\\Setup\\config.txt";
    
    	sei.nShow = SW_SHOWNORMAL;
    
        if (FALSE == ShellExecuteEx(&sei))
        {
    		// Gebe Error aus
        }
    
    	return 0;
    }
    

    Ich fürchte der Fehler liegt in der Convertirung von dem String zu dem LPTSTR.

    Dan kommt noch die Sache mit den Registry abfragen, wenn mir da einer nen Beispiel geben könnte.

    Über hilfe würde ich mich sehr freuen

    MFG TobiasVogt



  • sei.lpFile  = L"\\Storage Card\\Setup\\config.txt";
    

    ?

    Für das Problem mit der Registry wärst du wahrscheinlich besser im WinAPI Forum aufgehoben.

    Ansonsten kannst du dich hier einlesen:
    http://msdn.microsoft.com/en-us/library/ms724871(VS.85).aspx



  • Dieser Thread wurde von Moderator/in volkard aus dem Forum C++ in das Forum WinAPI verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • @drakon das ist ja supper danke für die schnelle richtige Antwort das funktioniert so

    wie mache ich das jetzt am besten mit dem Registry oder wo erfahre ich sonst welche cabs bereits instaliert sind?



  • So sieht jetzt mein Code aus

    // Startup.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    
    // QueryKey - Enumerates the subkeys of key and its associated values.
    //     hKey - Key whose subkeys and values are to be enumerated.
    
    #include <windows.h>
    #include <stdio.h>
    #include <tchar.h>
    
    #include <string>
    using namespace std;
    
    #define MAX_KEY_LENGTH 255
    #define MAX_VALUE_NAME 16383
    
    bool QueryKey(HKEY hKey) 
    { 
    	bool bIstInstalliert = false;
    
        TCHAR    achKey[MAX_KEY_LENGTH];   // buffer for subkey name
        DWORD    cbName;                   // size of name string 
        TCHAR    achClass[MAX_PATH] = TEXT("");  // buffer for class name 
        DWORD    cchClassName = MAX_PATH;  // size of class string 
        DWORD    cSubKeys=0;               // number of subkeys 
        DWORD    cbMaxSubKey;              // longest subkey size 
        DWORD    cchMaxClass;              // longest class string 
        DWORD    cValues;              // number of values for key 
        DWORD    cchMaxValue;          // longest value name 
        DWORD    cbMaxValueData;       // longest value data 
        DWORD    cbSecurityDescriptor; // size of security descriptor 
        FILETIME ftLastWriteTime;      // last write time 
    
        DWORD i, retCode; 
    
        TCHAR  achValue[MAX_VALUE_NAME]; 
        DWORD cchValue = MAX_VALUE_NAME; 
    
        // Get the class name and the value count. 
        retCode = RegQueryInfoKey(
            hKey,                    // key handle 
            achClass,                // buffer for class name 
            &cchClassName,           // size of class string 
            NULL,                    // reserved 
            &cSubKeys,               // number of subkeys 
            &cbMaxSubKey,            // longest subkey size 
            &cchMaxClass,            // longest class string 
            &cValues,                // number of values for this key 
            &cchMaxValue,            // longest value name 
            &cbMaxValueData,         // longest value data 
            &cbSecurityDescriptor,   // security descriptor 
            &ftLastWriteTime);       // last write time 
    
        // Enumerate the subkeys, until RegEnumKeyEx fails.
    
        if (cSubKeys) // = 10
        {
            for (i=0; i<cSubKeys; i++) 
            { 
                cbName = MAX_KEY_LENGTH;
                retCode = RegEnumKeyEx(hKey, i,
                         achKey, 
                         &cbName, 
                         NULL, 
                         NULL, 
                         NULL, 
                         &ftLastWriteTime); 
                if (retCode == ERROR_SUCCESS) 
                {
    				if (achKey == "Microsoft .NET CF 2.0")
    				{
    					bIstInstalliert = true;
    				}
                }
            }
        } 
    
    	return bIstInstalliert;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {     
    	HKEY hTestKey;
    
    	if( RegOpenKeyEx( HKEY_LOCAL_MACHINE, TEXT("Software\\Apps"), 0, KEY_READ, &hTestKey) == ERROR_SUCCESS)
    	{
    	  if(!QueryKey(hTestKey))
    	  {
    			SHELLEXECUTEINFO seiNET           = {0};
    
    			// Execute the file.
    			seiNET.cbSize = sizeof(SHELLEXECUTEINFO);
    			seiNET.lpFile  = L"\\Storage Card\\Setup\\NETCFv2.ppc.armv4.cab";
    
    			seiNET.nShow = SW_SHOWNORMAL;
    
    			if (FALSE == ShellExecuteEx(&seiNET))
    			{
    				// Gebe Error aus
    			}
    	  }
    	}
    
    	RegCloseKey(hTestKey);
    	return 0;
    }
    

    Dieser Vergleich klappt leider nicht

    if (achKey == "Microsoft .NET CF 2.0")
    				{
    					bIstInstalliert = true;
    				}
    

    Wenn das Framwork bereits instaliert ist, ist achKey irgendwan gleich "Microsoft .NET CF 2.0"



  • hab es geschaft



  • In c++ ist das mit den String-Vergleichen immer ein bischen kompliziert:

    bool QueryKey(HKEY hKey) 
    { 
        bool bIstInstalliert = false;
    
        wstring key; //bzw. wenn dein Project nicht auf Unicode eingestellt ist: string key;
    
        //...//
    
        if (cSubKeys) // = 10
        {
            for (i=0; i<cSubKeys; i++) 
            { 
                cbName = MAX_KEY_LENGTH;
                retCode = RegEnumKeyEx(hKey, i,
                         achKey, 
                         &cbName, 
                         NULL, 
                         NULL, 
                         NULL, 
                         &ftLastWriteTime); 
                if (retCode == ERROR_SUCCESS) 
                {
                    key = achKey;
                    if (key.compare(L"Microsoft .NET CF 2.0"))
                    {
                        bIstInstalliert = true;
                    }
                }
            }
        } 
    
        return bIstInstalliert;
    }
    

    ungetestet...

    MfG Tim


Anmelden zum Antworten