free web page counters

Windows Mobile Pocket PC Smartphone Programming

==>Click here for the SiteMap<==. Original contents with decent amount of source codes.

Wednesday, March 15, 2006

Source code to find out all the programs that are installed in a Windows Mobile device and that can be un-Installed

====>SiteMap of this Blog<===

Source code to find out all the programs that are installed in a Windows Mobile device and that can be un-Installed

In the post "Programmatically find out all the programs that can be unInstalled in Windows Mobile devices", I showed how to locate a list of programs installed in a Windows Mobile device. Pocket PC 2003 and other newer platforms (Smartphone 2003, Pocket PC 5.0, and Smartphone 5.0) have to be handled differently.

A reader actually sent me an email for the source code. Oh well this is an easy one so I am posting here:


#include "cfgmgrapi.h"
HRESULT QueryAllInstalled_DM()
{
  LPTSTR szProvXMLOut = NULL;
  TCHAR szProvXMLIn[512];

  memset(szProvXMLIn, 0, 512*sizeof(TCHAR));
  wcscat(szProvXMLIn, TEXT("<wap-provisioningdoc><characteristic-query type=\"UnInstall\">"));
  wcscat(szProvXMLIn, TEXT("</characteristic-query></wap-provisioningdoc>"));

  HRESULT hr = DMProcessConfigXML(szProvXMLIn, CFGFLAG_PROCESS, &szProvXMLOut);
  if (!FAILED(hr)) {
    ALERT2(TEXT("SUCCESS"), TEXT("DM"));
  } else {
    ALERT2(TEXT("FAILED"), TEXT("DM"));
  }
  ALERT2(szProvXMLOut, TEXT("DM"));

  DELETE_STR(szProvXMLOut);

  return hr;
}


#define APPS_REGHOME TEXT("\\Software\\Apps")
static HRESULT QueryAllInstalled_Registry()
{
  HRESULT hr = E_FAIL;
  LRESULT lr = E_FAIL;
  HKEY hKey = NULL;

  DWORD dwcSubKeys = 0; // Number of sub keys
  DWORD dwcMaxSubKeyName = 0; // Longest sub key name
  TCHAR* szSubKeyName = NULL; // subkey names
  DWORD j = 0;

  // Open the predefined registry
  lr = RegOpenKeyEx(HKEY_LOCAL_MACHINE, APPS_REGHOME, 0, 0, &hKey);
  if (ERROR_SUCCESS != lr) {
    goto FuncExit;
  }
  
  // Get Value count.
  lr = RegQueryInfoKey(hKey, // Key handle.
    NULL, // Buffer for class name.
    NULL, // Length of class string.
    NULL, // Reserved.
    &dwcSubKeys, // Number of sub keys.
    &dwcMaxSubKeyName, // Longest sub key size.
    NULL, // Longest class string.
    NULL, // Number of values for this key.
    NULL, // Longest Value name.
    NULL, // Longest Value data.
    NULL, // Security descriptor.
    NULL); // Last write time.
  
  // Enumerate the sub keys
  if (!dwcSubKeys || dwcMaxSubKeyName <= 0) {
    goto FuncExit;
  }
  szSubKeyName = new TCHAR[dwcMaxSubKeyName+1];
  if (NULL == szSubKeyName) {
    goto FuncExit;
  }

  for (j = 0, lr = ERROR_SUCCESS; j < dwcSubKeys; j++)
   {
    DWORD dwcSubKeyName = dwcMaxSubKeyName;
    memset(szSubKeyName, 0, sizeof(TCHAR)*(dwcMaxSubKeyName+1));
    HKEY hSubKey = NULL;

    lr = RegEnumKeyEx(
      hKey,
      j,
      szSubKeyName,
      &dwcSubKeyName,
      NULL,
      NULL,
      NULL,
      NULL);

    if (ERROR_SUCCESS != lr) {
      continue;
    }

    // now we have the key name. let us open it.
    lr = RegOpenKeyEx(hKey, szSubKeyName, 0, 0, &hSubKey);
    if (ERROR_SUCCESS != lr) {
      continue;
    }

    DWORD dwInstl = 0;
    DWORD dwValueType = REG_DWORD;
    DWORD dwValueLen = sizeof(DWORD);
    lr = RegQueryValueEx(hSubKey, TEXT("Instl"), NULL, &dwValueType, (LPBYTE)&dwInstl, &dwValueLen);
    if (ERROR_SUCCESS == lr) {
      if (dwInstl == 1) {
        ALERT2(szSubKeyName, TEXT("From Registry"));
      }
    }

    RegCloseKey(hSubKey);
  }

FuncExit:
  if (szSubKeyName) {
    delete []szSubKeyName;
  }
  if (hKey) {
    RegCloseKey(hKey);
  }

  return hr;
}



Category: [Setup / Install / unInstall / Upgrade]

====>SiteMap of this Blog<===