Seite 1 von 1

Windows installierte Software direkt einlesen

Verfasst: 20.12.2010 14:42
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

Re: Windows installierte Software direkt einlesen

Verfasst: 20.12.2010 15:16
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

Re: Windows installierte Software direkt einlesen

Verfasst: 30.01.2011 13:04
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

Re: Windows installierte Software direkt einlesen

Verfasst: 30.01.2011 15:05
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.

Re: Windows installierte Software direkt einlesen

Verfasst: 01.02.2011 09:27
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

Re: Windows installierte Software direkt einlesen

Verfasst: 01.02.2011 10:02
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

Re: Windows installierte Software direkt einlesen

Verfasst: 01.02.2011 12:49
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.

Re: Windows installierte Software direkt einlesen

Verfasst: 01.02.2011 13:17
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.

Re: Windows installierte Software direkt einlesen

Verfasst: 01.02.2011 14:05
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