Autor Beitrag
besy
Hält's aus hier
Beiträge: 10
Erhaltene Danke: 1



BeitragVerfasst: Do 08.07.10 08:06 
Hallo Forum,

ich habe eine WinForms Anwendung die viele dolle Dinge tut, unter anderem erzeugt sie ein TabControl, welches auf 2 seiner Tabs Grafiken darstellt. Selbige Grafiken werden in einer separaten Klasse mit Excel erzeugt (GDI+ war mir zu fisselig).

Jetzt setzt dieses Vorgehen natürlich vorraus das auf dem PC Excel installiert ist, andernfalls sollen die 2 Tabs deaktiviert werden.
Also muss herausgefunden werden ob Excel (bzw. Office) installiert ist, bis jetzt schaut das so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
private bool isExcelInstalled()
{
    string programName = "Microsoft Office";
    string uninstallList = @"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall";
    object obj;
    Microsoft.Win32.RegistryKey RegKeyUninstallList = Microsoft.Win32.Registry.LocalMachine;
    Microsoft.Win32.RegistryKey SubKeyUninstallList = Microsoft.Win32.Registry.LocalMachine;

    foreach (string subKey in RegKeyUninstallList.OpenSubKey(uninstallList).GetSubKeyNames())
    {
           obj = SubKeyUninstallList.OpenSubKey(uninstallList + "\\" + subKey).GetValue("DisplayName");
           if (obj != null)
           {
                if (obj.ToString().ToLower().Contains(programName.ToLower()))
                return true;
           }
    }

    return false;
}


Funktioniert soweit auch, mein Problem ist jetzt eher der "programName" nachdem gesucht wird. In dem Stück Code oben suche in nach "Microsoft Office", dummerweise setzt da ein Treffer nicht vorraus das auch Excel da ist. Es gibt zBsp den Microsoft Office Viewer, den Microsoft Office Communicator, und die geben auch alle true zurück.

Klar, ich kann auch nach "Microsoft Office Proffesional 2003" suchen, dann wirds bei mir hier super laufen, aber was wenn jmd nicht Proffesional hat, oder die 2010er Version, oder oder oder...

Wie kann ich wirklich sicherstellen das Excel installiert ist ? Gibt es vlt irgendwo eine Liste aller gängigen OfficeBezeichnungen auf die ich Abfragen könnte ? Oder gar einen ganz anderen Ansatz als meinen ?

Für Hilfe wär ich dankbar.
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Do 08.07.10 19:40 
Ich hab in einem alten Delphi-Programm von mir das hier gefunden:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
function isExcelInstalled : Boolean;
var
  reg: TRegistry;
begin
  Reg := TRegistry.Create;
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    Result := Reg.KeyExists('Excel.Application');
  finally
    Reg.Free;
  end;
end;

Sollte nicht schwer sein, das in C# umzusetzen.

Allerdings ist das schon lange her, seit ich das benutzt habe. Ob das funktioniert oder eine Jugendsünde ist, kann ich Dir daher nicht genau sagen :lol:

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
besy Threadstarter
Hält's aus hier
Beiträge: 10
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.07.10 11:10 
Hallo,

danke für den Tipp.
Hab mich beim umbauen etwas schwer getan aber letztendlich sieht es nun so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Microsoft.Win32.RegistryKey rootKey = Microsoft.Win32.Registry.ClassesRoot;
string[] subkeyNames = rootKey.GetSubKeyNames();
foreach (string name in subkeyNames)
{
    if (name == "Excel.Application")
         return true;
}
return false;


Funktioniert auch, bei mir zumindest mal.
Da ich aber blöderweise ja jetzt nicht anfangen möchte mein Excel (bzw. Office) zu deinstallieren ist das echt blöd zu testen. Da wird mir wenig anderes übrig bleiben als das Programm dann einfach so zu verteilen und auf Feedback zu warten...
besy Threadstarter
Hält's aus hier
Beiträge: 10
Erhaltene Danke: 1



BeitragVerfasst: Fr 09.07.10 11:32 
Da fällt mir ein ... ich bin mal so frech ...

Falls hier jemand liest der kein Excel oder Office auf dem PC hat, vlt hat er ja Lust die 2 Codestückchen zu kopieren und schnell in ein C# Projekt zu hauen, die sind ja alleine lauffähig, und zu schauen ob es funktioniert und hier dann Bescheid sagen.

Das wäre natürlich toll :)
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Di 20.07.10 19:07 
user profile iconbesy hat folgendes geschrieben Zum zitierten Posting springen:
Da fällt mir ein ... ich bin mal so frech ...

Falls hier jemand liest der kein Excel oder Office auf dem PC hat, vlt hat er ja Lust die 2 Codestückchen zu kopieren und schnell in ein C# Projekt zu hauen, die sind ja alleine lauffähig, und zu schauen ob es funktioniert und hier dann Bescheid sagen.

Das wäre natürlich toll :)

Das ist ja die reinste CPU verschwendung ;)

Direkter Zugriff auf das Node ohne zu Loopen:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
RegistryKey OurKey = Registry.ClassesRoot;
if( OurKey.OpenSubKey("Excel.Application"false) != null){
  // Ist installiert
}else{
  // Ist NICHT installiert
}


Und in deinem Fall läst sich das in 2 Zeilen lösen:
ausblenden C#-Quelltext
1:
2:
            RegistryKey OurKey = Registry.ClassesRoot;
            return (OurKey.OpenSubKey("Excel.Application"false) != null);

Edit: Code gekürzt, danke Kha!


Zuletzt bearbeitet von IsNull am Mi 21.07.10 07:31, insgesamt 1-mal bearbeitet
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Di 20.07.10 20:40 
Dein ternärer Operator ist etwas redundant ;) .

ausblenden C#-Quelltext
1:
2:
using (RegistryKey key = Registry.ClassesRoot.OpenSubKey("Excel.Application"))
  return key != null;

_________________
>λ=
IsNull
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 97
Erhaltene Danke: 11


VS 2010, C#, AHK
BeitragVerfasst: Mi 21.07.10 07:34 
Hmpf, ja war ziemlich unnötig, danke. ;)
norman2306
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 222
Erhaltene Danke: 16

Win XP, Win 7 64-Bit
C# 4.0 (VS2010)
BeitragVerfasst: Mi 21.07.10 09:51 
Einer geht noch:

ausblenden C#-Quelltext
1:
return Registry.ClassesRoot.OpenSubKey("Excel.Application") != null;					
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 21.07.10 09:56 
RegistryKey implementiert IDisposable, also sollte man schon die using-Klausel drin lassen.

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".