Seite 1 von 1

Datei assoziieren

Verfasst: 08.01.2013 17:15
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.

Re: Datei assoziieren

Verfasst: 08.01.2013 17:42
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"

Re: Datei assoziieren

Verfasst: 08.01.2013 17:45
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$)

Re: Datei assoziieren

Verfasst: 09.01.2013 08:14
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

Re: Datei assoziieren

Verfasst: 09.01.2013 09:18
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



Re: Datei assoziieren

Verfasst: 01.02.2013 23:18
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.

Re: Datei assoziieren

Verfasst: 01.02.2013 23:29
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

Re: Datei assoziieren

Verfasst: 02.02.2013 00:10
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.

Re: Datei assoziieren

Verfasst: 02.02.2013 00:12
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.