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