Windows installierte Software direkt einlesen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Windows installierte Software direkt einlesen

Beitrag von Velindos »

Hallo,
Da ich zur Zeit meine "installierte Software" über den CCleaner Abfrage und eine Datei erstelle, würde mich interessieren ob es eine Möglichkeit in PB gibt, die "installierte Software" von Windows direkt über PB auszulesen?

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Windows installierte Software direkt einlesen

Beitrag von Kiffi »

als Vorarbeit: regedit starten und diesen Schlüssel suchen:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall

hierunter befinden sich alle Einträge, die in der Softwareliste erscheinen.

Über diese Einträge musst Du mit RegEnumKey(Ex) iterieren und den jeweiligen DisplayName ermitteln.

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows installierte Software direkt einlesen

Beitrag von Velindos »

Hallo,
in dieser Sache bin ich nicht weitergekommen. Liegt daran das ich noch PB_Anfänger bin und zu wenig über diese Medie(WindowsRegistry) auskenne.
Meine Idee wäre, die Inhalte in einen ListIconGadget so Darzustellen wie es unter |Windows|Standardprogramme|Programme und Funktionen|Installierte Programme erfolgt. Habe einiges probiert aber nichts in die Wege gebracht, vielleicht kann mir wer helfen?
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows installierte Software direkt einlesen

Beitrag von RSBasic »

Hallo Velindos,


für meine Software "PCInfoPoint" brauchte ich sowas ebenfalls.
Wie man alle Programme, die installiert sind, aus der Registry ermitteln kann (inkl. Pfad zur Deinstallation) habe ich für sowas folgendes geschrieben:

Code: Alles auswählen

EnableExplicit

Define EventID

Procedure.s GetInstalledProgramDisplayName(vKey.s)
  Protected Size
  Protected Name$
  Protected Result
  Protected Key
  
  Size=#MAX_PATH
  Name$=Space(Size)
  Result=RegOpenKeyEx_(#HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"+vKey.s,0,#KEY_ALL_ACCESS,@Key)
  If Result=0
    RegQueryValueEx_(Key,"DisplayName",0,0,@Name$,@Size)
    RegCloseKey_(Key)
  EndIf
  ProcedureReturn Name$
EndProcedure

Procedure.s GetInstalledProgramUninstallString(vKey.s)
  Protected Size
  Protected Name$
  Protected Result
  Protected Key
  
  Size=#MAX_PATH
  Name$=Space(Size)
  Result=RegOpenKeyEx_(#HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\"+vKey.s,0,#KEY_ALL_ACCESS,@Key)
  If Result=0
    RegQueryValueEx_(Key,"UninstallString",0,0,@Name$,@Size)
    RegCloseKey_(Key)
  EndIf
  ProcedureReturn Name$
EndProcedure

Procedure.s GetInstalledProgramNames(hKey.l, sKey.s, pc.s)
  Protected ret.l
  Protected hnd.l
  Protected vKey.s
  Protected vSize.l
  Protected vLWT.FILETIME
  Protected remhnd.l
  Protected Index.l
  Protected DisplayName$
  Protected UninstallString$
  
  ret=RegConnectRegistry_(pc, hKey, @remhnd)
  If ret=#ERROR_SUCCESS
    ret=RegOpenKeyEx_(remhnd, sKey, 0, #KEY_ALL_ACCESS, @hnd)
    If ret=#ERROR_SUCCESS
      Index=0
      While ret=#ERROR_SUCCESS
        vSize=255 : vKey=Space(255)
        ret=RegEnumKeyEx_(hnd, Index, @vKey, @vSize, 0, 0, 0, @vLWT)
        If ret=#ERROR_SUCCESS
          DisplayName$=GetInstalledProgramDisplayName(vKey)
          UninstallString$=GetInstalledProgramUninstallString(vKey)
          If Not RTrim(DisplayName$)=""
            AddGadgetItem(10,-1,DisplayName$+Chr(10)+UninstallString$,0,0)
          EndIf
        EndIf
        Index+1
      Wend
    EndIf
  EndIf
  RegCloseKey_(remhnd)
EndProcedure

If OpenWindow(0,0,0,500,400,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered|#PB_Window_MinimizeGadget|#PB_Window_MaximizeGadget|#PB_Window_SizeGadget)
  ListIconGadget(10,0,0,WindowWidth(0),WindowHeight(0),"Programmname",200,0)
  AddGadgetColumn(10,1,"Deinstallationspfad",200)
  
  GetInstalledProgramNames(#HKEY_LOCAL_MACHINE,"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall","")
  
  Repeat
    EventID=WaitWindowEvent()
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf
Ich hoffe, es hilft dir weiter, um daraus deine Darstellung zu erstellen.
Ist vielleicht nicht perfekt, aber es funktioniert jedenfalls.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows installierte Software direkt einlesen

Beitrag von Velindos »

Hallo,
danke für deinen Source. Mir fehlen aber noch die Spalten wie Version, installiert am, Herausgeber und Grösse. Bin hier noch am tüffteln, wenn jemand was weiss!
Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Windows installierte Software direkt einlesen

Beitrag von Kiffi »

Velindos hat geschrieben:Mir fehlen aber noch die Spalten wie Version, installiert am, Herausgeber und Grösse.
hast Du Dir denn die Registryeinträge mal mit RegEdit angeschaut?
Dort steht alles, was Du ermitteln möchtest.

Bild

Grüße ... Kiffi
a²+b²=mc²
Benutzeravatar
RSBasic
Admin
Beiträge: 8047
Registriert: 05.10.2006 18:55
Wohnort: Gernsbach
Kontaktdaten:

Re: Windows installierte Software direkt einlesen

Beitrag von RSBasic »

Hallo Velindos,


wie Kiffi bereits gesagt hat, kannst du aus der Registry alle Werte entnehmen, die du benötigt.
Du hast ja von mir eine Grundlage erhalten und mit dieser kannst du problemlos erweitern.
Aus privaten Gründen habe ich leider nicht mehr so viel Zeit wie früher. Bitte habt Verständnis dafür.
Bild
Bild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Windows installierte Software direkt einlesen

Beitrag von ts-soft »

Mal so Nebenbei:

Wenn ein Nichtschwimmer fragt, wo er sich für die nächsten Schwimmweltmeisterschaften anmeldet,
würde ich mich nicht für Ihn anmelden und ihm den Pokal reichen, ich würden ihn in das Wasser
werfen, damit er erst einmal Schwimmen lernt.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Velindos
Beiträge: 598
Registriert: 15.11.2010 10:56

Re: Windows installierte Software direkt einlesen

Beitrag von Velindos »

Hallo Leute,
das mit Schwimmen ist ja ein guter Ansatz, dann machst du ja gleich den Weltmeister bei diesen Problem.
Als nochmals Danke für dein Beispiel! Habe mich damit beschäftigt.

Ein Problem ist da ich unter Windows7/64Bit arbeite, dass Windows zwei Verzeichnisse hat (C:\Program Files, C:\Program Files (x86)).
Nach dem Test habe ich festgestellt das die Software nicht vollständig ist.

Die Übersicht kann auch direkt im Windows mit appwiz.cpl aufgerufen werden. Jedoch der Inhalt dieser stimmt in keinen Fall zur Zeit mit dem Beispiel überrein!
Also werde ich weitertüffteln und trotzt aller Unkenrufe das Problem lösen.

Gruss ... Velindos
Windows 7/8/8.1/10 (32/64-Bit) |Ubuntu 10.4 (64-Bit) |Purebasic 5.71 LTS (32/64-Bit)
Antworten