Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: FAQ - MFC ::  System - Wie gucke ich per MFC nach, ob ein Programm installiert ist? (.net 1.1 und MSDE 2000)     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 14:17:47 28.07.2005   Titel:   System - Wie gucke ich per MFC nach, ob ein Programm installiert ist? (.net 1.1 und MSDE 2000)            Zitieren

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 :)


Zuletzt bearbeitet von estartu am 14:31:01 16.01.2006, insgesamt 2-mal bearbeitet
Werbeunterbrechung
tvdog
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.06.2005
Beiträge: 118
Beitrag tvdog Mitglied 14:29:15 28.07.2005   Titel:              Zitieren

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 ?
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 14:36:52 28.07.2005   Titel:              Zitieren

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. :)
tvdog
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.06.2005
Beiträge: 118
Beitrag tvdog Mitglied 14:57:04 28.07.2005   Titel:              Zitieren

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 ) ?
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 15:02:11 28.07.2005   Titel:              Zitieren

Ü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.) :(
tvdog
Mitglied

Benutzerprofil
Anmeldungsdatum: 29.06.2005
Beiträge: 118
Beitrag tvdog Mitglied 15:28:35 28.07.2005   Titel:              Zitieren

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.
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 08:35:22 01.08.2005   Titel:              Zitieren

Vielen Dank. :live:

Nach einem kleinen Kampf mit RegQueryKeyEx habe ich gewonnen. :D
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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);
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
    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:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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");
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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");
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
    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");


Zuletzt bearbeitet von estartu am 09:35:05 01.08.2005, insgesamt 1-mal bearbeitet
joe84
Unregistrierter




Beitrag joe84 Unregistrierter 20:03:34 07.08.2005   Titel:              Zitieren

cool, das hatte ich auch schon gesucht !

-> FAQ verdächtig oder ?
estartu
Moderator

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 20:13:45 07.08.2005   Titel:              Zitieren

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

Benutzerprofil
Anmeldungsdatum: 05.09.2003
Beiträge: 11494
Beitrag estartu Moderator 09:16:25 08.08.2005   Titel:              Zitieren

So, hier ist die komplette Funktion für die MSDE:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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");
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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");
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
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. :warning:
C/C++ Forum :: FAQ - MFC ::  System - Wie gucke ich per MFC nach, ob ein Programm installiert ist? (.net 1.1 und MSDE 2000)   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können keine Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum nicht antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.