System - Wie gucke ich per MFC nach, ob ein Programm installiert ist? (.net 1.1 und MSDE 2000)



  • Hallo!

    Ich möchte gerne Buttons (de-)aktivieren, je nachdem ob bestimmte Programme installiert sind.
    Wie macht man das? Ich hatte schon die Idee, in der Registry nachzuschauen, aber wo da?

    Es geht um:
    .net Framework 1.1
    MSDE 2000

    Danke für Tips und Lektüre 🙂



  • Ich habe hierfür die API-Funktion MsiQueryProductState verwendet. Sie ist Bestandteil des Windows Installer API.

    Hier gibt es auch noch jede Menge Funktionen um z.B. die installierte Version und Patches zu ermitteln.

    In der Registry wird das auch irgendwo abgelegt, hab mal gesucht und unter
    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Installer\UserData und deren Unterschlüssel die Programme gefunden, die mir der Software-Dialog der Systemsteuerung anzeigt. Ob das aber wirklich der richtige Ort ist ?



  • Muss ich dafür ein Installer-Projekt haben?

    Ich habe nämlich eine normale Dialoganwendung, weil das schnell gehen sollte und ich durch die Sachen mit dem Installer nicht gut genug durchgefunden habe. (Gab dazu hier nen Thread und in "Rund um die Programmierung".)

    Aber die Ecke in der Registry scheint nicht der schlechteste Anfang zu sein. 🙂



  • Für die Msi-Funktionen benötigst du eine über den Windows Installer installierte Anwendung. 😞

    Aber vielleicht kann sich deine Anwendung in der Registry bei der Installation eintragen ( z.B. einen Schlüssel unter HKEY_LOCAL_MACHINE\Software\<MyCompany> ) und du prüfst auf die Existenz dieses Schlüssels ab ( So hab ichs mir damals jedenfalls bei mir gedacht ) ?



  • Über meine Anwendung mache ich mir keine Sorgen, da ich ihr Verhalten steuern kann. 😉

    Sorgen machen mir die "Vorraussetzungen" nämlich die MSDE und deren Voraussetzung .net Framework 1.1 (s.o.) 😞



  • Mit dem .NET Framework habe ich das auch gemacht. Hier hat Microsoft auch einen Artikel in der MSDN darüber geschrieben:

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetdep/html/redistdeploy1_1.asp

    Hier gibts zwei Möglichkeiten:

    1. Suche in der Seite nach Detecting that the .NET Framework 1.1 is installed

    2. Suche in der Seite nach Use Windows Installer API calls to validate that the .NET Framework is installed on the machine

    Ich habs damals nach Schema "2" gemacht.
    Bei MSDE wirds ähnlich funktionieren.



  • Vielen Dank. 👍

    Nach einem kleinen Kampf mit RegQueryKeyEx habe ich gewonnen. 😃

    DWORD dwSize = sizeof (DWORD);
    	DWORD dwNetIsInstalled = 0;
    	HKEY hKey = NULL;
    	RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    					"SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v1.1.4322",
    					NULL,
    					KEY_QUERY_VALUE,
    					&hKey);
    	RegQueryValueEx(hKey, 
    					"Install",
    					NULL, 
    					NULL,
    					(LPBYTE)&dwNetIsInstalled,
    					&dwSize);
    	RegCloseKey(hKey);
    	GetDlgItem(IDC_BTN_NET11)->EnableWindow(dwNetIsInstalled != 1);
    

    Jetzt muss ich noch die MSDE finden und dann sollte es gehen. 🙂

    Edit: So geht es für die MSDE:

    TCHAR cData[255];
    	memset(cData, 0, sizeof(cData));
    	DWORD  StringSize = 255;
    	HKEY hKey = NULL;
    	RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    					"SOFTWARE\\Microsoft\\MSSQLServer\\MSSQLServer\\CurrentVersion",
    					NULL,
    					KEY_QUERY_VALUE,
    					&hKey);
    	RegQueryValueEx(hKey, 
    					"CurrentVersion", 
    					NULL,
    					NULL, 
    					(LPBYTE)cData, 
    					&StringSize);
    	RegCloseKey(hKey);
    	CString strInhalt(cData);
    
    	GetDlgItem(IDC_BTN_MSDE)->EnableWindow(strInhalt != "8.00.194");
    


  • cool, das hatte ich auch schon gesucht !

    -> FAQ verdächtig oder ?



  • Ich kann es ja gerne noch vervollständigen und dann verschieben. 🙂
    (Die MSDE hat nämlich zwei Stellen, wo man sie suchen muss.)



  • So, hier ist die komplette Funktion für die MSDE:

    bool CSetupDlg::IsMsdeInstalled()
    {
    	TCHAR cData[255];
    	memset(cData, 0, sizeof(cData));
    	DWORD  StringSize = 255;
    	HKEY hKey = NULL;
    	if (ERROR_SUCCESS == RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    					"SOFTWARE\\Microsoft\\MSSQLServer\\MSSQLServer\\CurrentVersion",
    					NULL,
    					KEY_QUERY_VALUE,
    					&hKey))
    	{
    		RegQueryValueEx(hKey, 
    						"CurrentVersion", 
    						NULL,
    						NULL, 
    						(LPBYTE)cData, 
    						&StringSize);
    	}
    	else
    	{
    		RegOpenKeyEx(HKEY_LOCAL_MACHINE, 
    						"SOFTWARE\\Microsoft\\Microsoft SQL Server\\MY_INSTANCE_NAME\\MSSQLServer\\CurrentVersion",
    						NULL,
    						KEY_QUERY_VALUE,
    						&hKey);
    		RegQueryValueEx(hKey, 
    						"CurrentVersion", 
    						NULL,
    						NULL, 
    						(LPBYTE)cData, 
    						&StringSize);
    	}
    	RegCloseKey(hKey);
    	CString strInhalt(cData);
    
    	return (strInhalt == "8.00.194");
    }
    

    Beachtet bitte, dass MY_INSTANCE_NAME mit Hilfe eines #define noch auf Eure Instanz "zeigen" muss. ⚠


Anmelden zum Antworten