Datei assoziieren

Für allgemeine Fragen zur Programmierung mit PureBasic.
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Datei assoziieren

Beitrag von Lambda »

Gefundene Beispiele sind leider nutzlos.

Bild
Kurz und knapp: Genau das was diese Einstellung bewirkt möchte ich auf eigene Formate anwenden. Es nutzt auch gleich das Programm Symbol als Icon.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7039
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Datei assoziieren

Beitrag von STARGÅTE »

Also funktionierende Registry-Includes gibts es hier genug.
Mit denen kannst du ganz einfach deine Einträge anlegen:
[HKEY_CLASSES_ROOT\.blub]
@="DateiTypBlub"
[HKEY_CLASSES_ROOT\DateiTypBlub]
@="Blub-Datei"
[HKEY_CLASSES_ROOT\DateiTypBlub\DefaultIcon]
@="IconPfad,1"
[HKEY_CLASSES_ROOT\DateiTypBlub\shell]
[HKEY_CLASSES_ROOT\DateiTypBlub\shell\open]
@="Öffnen"
[HKEY_CLASSES_ROOT\DateiTypBlub\shell\open\command]
@="Exe-Pfad %1"
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
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: Datei assoziieren

Beitrag von ts-soft »

siehe: http://www.purebasic.fr/german/viewtopi ... 60#p177460
Ist vielleicht etwas veraltet, aber entweder überarbeiten oder nochmals suchen.

Gemeint ist die Procedure: Procedure AssociateFileEx(AF_Ext$,ext_description$,programm$,icon$,prgkey$,cmd_description$,cmd_key$)
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
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: Datei assoziieren

Beitrag von sharkpeter »

Hi cOoki3druqs,

oder du nimmst das. Wo du die Lib her bekommst, nun ja, unten ist ein Link ...

Die eingetragenen Namen beziehen sich auf ein Projekt von mir, daher entsprechend
den eigenen Bedürfnissen anpassen. Der obere Teil ist eine Prüfroutine, deren Inhalt
hier auskommentiert ist. Da kannst du was weiß ich, mit Requestern oder sonst was
arbeiten.

Ach so: Für sowas brauchst du Admin-Rechte auf deinem PC.

Gruß Jens

Code: Alles auswählen

  #HKCR = #HKEY_CLASSES_ROOT
; #RegCallDir = "DEIN_PROGRAMM"
; #RegFiletype2 = ".dpg"                                                          
; #RegPerceived = "dpg-data-file" 

; setdir1.s = "das komplette Verzeichnis"
; #RunExeName = "dein_programm.exe

      ; Programm anmelden, sonst geht es nicht
      JHRegCreateKey(#HKCR, #RegCallDir)
      JHRegCreateKey(#HKCR, #RegCallDir + "\shell")
      JHRegCreateKey(#HKCR, #RegCallDir + "\shell\open")
      JHRegCreateKey(#HKCR, #RegCallDir + "\shell\open\command")
      JHRegSetString(#HKCR, #RegCallDir + "\shell\open\command", "", setdir1 + #RunExeName + " %1")

      If JHRegIsKey(#HKCR, #RegFiletype2)
        If JHRegGetString(#HKCR, #RegFiletype2, "PerceivedType") = ""
          JHRegSetString(#HKCR, #RegFiletype2, ""             , #RegCallDir)
          JHRegSetString(#HKCR, #RegFiletype2, "Content Type" , "text/plain")
          JHRegSetString(#HKCR, #RegFiletype2, "PerceivedType", #RegPerceived)
          ;SetGadgetState(#SetProgre_0 ,  97) 
          ;SetGadgetState(#SetProgre_1 , 100) 
          ;SetGadgetText (#SetText_0   , "Dateityp *" + #RegFiletype2 + " ist registriert ...")
          ;SetWindowTitle(#Child_SetWin, "Installationsfortschritt 97%")
          ;Delay(200)
        Else
          If JHRegGetString(#HKCR, #RegFiletype2, "PerceivedType") <> #RegPerceived
            ;SetGadgetState(#SetProgre_0 ,  97) 
            ;SetGadgetState(#SetProgre_1 , 100) 
            ;SetGadgetText (#SetText_0   , "Dateityp *" + #RegFiletype2 + " ist bereits registriert ...")
            ;SetWindowTitle(#Child_SetWin, "Installationsfortschritt 97%")
            ;Delay(200)
          Else
            ;SetGadgetState(#SetProgre_0 ,  97) 
            ;SetGadgetState(#SetProgre_1 , 100) 
            ;SetGadgetText (#SetText_0   , "Dateityp *" + #RegFiletype2 + " ist bereits registriert ...")
            ;SetWindowTitle(#Child_SetWin, "Installationsfortschritt 97%")
            ;Delay(200)
          EndIf
        EndIf
      Else
        JHRegCreateKey(#HKCR, #RegFiletype2)
        JHRegSetString(#HKCR, #RegFiletype2, ""             , #RegCallDir  )
        JHRegSetString(#HKCR, #RegFiletype2, "Content Type" , "text/plain" )
        JHRegSetString(#HKCR, #RegFiletype2, "PerceivedType", #RegPerceived)
        ;SetGadgetState(#SetProgre_0 ,  97) 
        ;SetGadgetState(#SetProgre_1 , 100) 
        ;SetGadgetText (#SetText_0   , "Dateityp *" + #RegFiletype2 + " ist registriert ...")
        ;SetWindowTitle(#Child_SetWin, "Installationsfortschritt 97%")
        ;Delay(200)
      EndIf
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
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: Datei assoziieren

Beitrag von ts-soft »

Das geht auch ohne Admin-Rechte!
Wer es nicht glaubt, die PB-IDE macht das bei jedem start :wink:
Ausserdem würde bei dem von cOoki3druqs gezeigtem Dialog ja sonst auch
UAC aufpoppen müssen.

Gruß
Thomas

//edit: hier mal mein code, den ich in X-ProfPad nutze (läuft ohne Admin)

Code: Alles auswählen

EnableExplicit

Procedure CreateRegistryKeyValue(topKey.i, KeyName$, ValueName$, Value$, Type.i = #REG_SZ, ComputerName$ = "")
  Protected SecurityAttributes.SECURITY_ATTRIBUTES
  Protected NewKey.i, GetHandle.i, RemoteRegistry.i
  Protected Datas$, Value.i
  Protected cbData.i

  ; Key erstellen
  If Left(KeyName$, 1) = "\"
    KeyName$ = Right(KeyName$, Len(KeyName$) - 1)
  EndIf

  If ComputerName$ = ""
    GetHandle = RegCreateKeyEx_(topKey, KeyName$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_WRITE, @SecurityAttributes, @NewKey, @GetHandle)
  Else
    RegConnectRegistry_(ComputerName$, topKey, @RemoteRegistry)
    GetHandle = RegCreateKeyEx_(RemoteRegistry, KeyName$, 0, 0, #REG_OPTION_NON_VOLATILE, #KEY_WRITE, @SecurityAttributes, @NewKey, @GetHandle)
  EndIf

  ; Key setzen
  If GetHandle = #ERROR_SUCCESS
    cbData = 255
    Datas$ = Space(255)
       
    Select Type
       Case #REG_SZ
          GetHandle = RegSetValueEx_(NewKey, ValueName$, 0, #REG_SZ,    @Value$, StringByteLength(Value$) + SizeOf(Character))
       Case #REG_DWORD
          Value = Val(Value$)
          GetHandle = RegSetValueEx_(NewKey, ValueName$, 0, #REG_DWORD, @Value$, 4)
    EndSelect
    RegCloseKey_(NewKey)
  EndIf
EndProcedure

Procedure Reg_KeyExists(topKey, sKeyName.s) 
  Protected GetHandle, hKey, KeyExists
  
  If Left(sKeyName, 1) = "\" 
    sKeyName = Right(sKeyName, Len(sKeyName) - 1) 
  EndIf 
  
  GetHandle = RegOpenKeyEx_(topKey, sKeyName, 0, #KEY_READ, @hKey) 
  
  If GetHandle = #ERROR_SUCCESS 
    KeyExists = #True 
  Else 
    KeyExists = #False 
  EndIf 
  ProcedureReturn KeyExists
   
EndProcedure 

Procedure AssociateFileExtension(Key$, Ext$, ExtDescription$, Programm$, Icon$, CmdDescription$)   ; Dateierweiterung in Registry eintragen
  Protected Cmd$                                                                                            ; Command
  Protected CmdPath$                                                                                        ; Pfad zu dem Eintrag
 
   CmdPath$ = Key$ + "\shell\" + CmdDescription$ + "\command"                     ; Pfad erstellen
   Cmd$     = Chr('"') + Programm$ + Chr('"') + " " + Chr('"') + "%1" + Chr('"')  ; Command erstellen
   CreateRegistryKeyValue(#HKEY_CLASSES_ROOT, "." + Ext$, "", Key$)               ; Schlüssel für die Erweiterung
   CreateRegistryKeyValue(#HKEY_CLASSES_ROOT, Key$, "", ExtDescription$)          ; Beschreibung
   CreateRegistryKeyValue(#HKEY_CLASSES_ROOT, CmdPath$, "", Cmd$)                 ; Programmaufruf
   
   If Icon$                                                                       ; Wenn ein Icon angegeben ist ...
     CreateRegistryKeyValue(#HKEY_CLASSES_ROOT, Key$ + "\DefaultIcon",  "", Icon$)  ; Icon-Datei eintragen
   EndIf
EndProcedure

;- Beispiel
Procedure DoFileAssociate(ext.s)
  Protected Prg.s, Exe.s
    
  Prg = ProgramFilename()
  Exe = GetFilePart(Prg)
  Exe = Left(Exe, Len(Exe) - 4)
  
  If OSVersion() >= #PB_OS_Windows_2000
    Select ext
      Case "prf", "inc", "ph", "profan", "xprf"
        AssociateFileExtension(ext + "_auto_file", ext, "XProfan-Datei", Prg, "", "edit")
      Case "psc"
        AssociateFileExtension("psc_auto_file", "psc", "Profan-Script", Prg, "", "edit")
      Case "xscript"
         AssociateFileExtension("xscript_auto_file", "xscript", "X-ProfPad Script", Prg, "", "open")
    EndSelect
  EndIf
EndProcedure

Procedure RemoveFileAssociate(ext.s)
  Protected Prg.s, Exe.s
    
  Prg = ProgramFilename()
  Exe = GetFilePart(Prg)
  Exe = Left(Exe, Len(Exe) - 4)
  
  Prg = ProgramFilename()
  If OSVersion() >= #PB_OS_Windows_2000
    Select ext
      Case "prf", "inc", "ph", "profan", "xprf"
        RegDeleteKey_(#HKEY_CLASSES_ROOT, ext + "_auto_file\shell\edit\command")
        RegDeleteKey_(#HKEY_CLASSES_ROOT, ext + "_auto_file\shell\edit")      
      Case "psc"
        RegDeleteKey_(#HKEY_CLASSES_ROOT, "psc_auto_file\shell\edit\command")
        RegDeleteKey_(#HKEY_CLASSES_ROOT, "psc_auto_file\shell\edit")      
      Case "xscript"
        RegDeleteKey_(#HKEY_CLASSES_ROOT, "xscript_auto_file\shell\open\command")
        RegDeleteKey_(#HKEY_CLASSES_ROOT, "xscript_auto_file\shell\open")
    EndSelect
  EndIf
EndProcedure

Procedure IsFileAssociate(ext.s)
  Protected Prg.s, Exe.s
    
  Prg = ProgramFilename()
  Exe = GetFilePart(Prg)
  Exe = Left(Exe, Len(Exe) - 4)
  
  Prg = ProgramFilename()
  If OSVersion() >= #PB_OS_Windows_2000
    Select ext
      Case "prf", "inc", "ph", "profan", "xprf"
        ProcedureReturn Reg_KeyExists(#HKEY_CLASSES_ROOT, ext + "_auto_file\shell\edit")
      Case "psc"
        ProcedureReturn Reg_KeyExists(#HKEY_CLASSES_ROOT, "psc_auto_file\shell\edit")
      Case "xscript"
        ProcedureReturn Reg_KeyExists(#HKEY_CLASSES_ROOT, "xscript_auto_file\shell\open")
    EndSelect
  EndIf
EndProcedure


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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Datei assoziieren

Beitrag von Lambda »

Danke für die Vorschläge, doch verändern diese leider nichts. (bis auf die Dateibeschreibung) Ein Icon/Verknüpfung wird nicht erstellt.
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: Datei assoziieren

Beitrag von ts-soft »

cOoki3druqs hat geschrieben:Danke für die Vorschläge, doch verändern diese leider nichts. (bis auf die Dateibeschreibung) Ein Icon/Verknüpfung wird nicht erstellt.
Was den für ein Icon? Was für eine Verknüpfung?
Obiger Code ist aus meinem XProfan-Editor X-ProfPad und funktioniert einwandfrei.
Assozierte Dateien werden per Doppelklick in diesen geladen.

Oder möchtest Du verknüpfungen erstellen, weil das hat ja mit obigem Dialog rein gar nichts zu tun.
Das findest Du hier: http://www.purebasic.fr/german/viewtopi ... 48#p270648
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
Lambda
Beiträge: 526
Registriert: 16.06.2011 14:38

Re: Datei assoziieren

Beitrag von Lambda »

Nein, ich meine alle Dateien mit der angegeben Endung werden nicht assoziiert. Lediglich die Beschreibung steht bei Dateien mit der gegebenen Endung dabei, aber die Datei nimmt nicht das Icon der Anwendung an genauso wenig wie es sie mit ihr öffnet.
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: Datei assoziieren

Beitrag von ts-soft »

Tja bei mir funktioniert es und auch das Icon wird bei entsprechenden Dateien angezeigt, und zwar das Icon der Exe,
da ich keine Datei für das Icon übergebe.
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
Antworten