öffnen mit: Programm abfragen

Fragen rund um diverse Windows-Versionen, ihr Verhalten unter Xbase++ und den Umgang mit der API

Moderator: Moderatoren

Antworten
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

öffnen mit: Programm abfragen

Beitrag von stevie »

Hi,
und wieder mal ein Problem. :lol:
Kann man herausfinden mit welchem Programm eine Datei beim Aufruf von

Code: Alles auswählen

RunShell("shell32.dll,OpenAs_RunDLL "+cFile,"Rundll32.exe")
geöffnet wurde?
Viele Grüße
Stevie
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: öffnen mit: Programm abfragen

Beitrag von AUGE_OHR »

stevie hat geschrieben:und wieder mal ein Problem. :lol:
Kann man herausfinden mit welchem Programm eine Datei beim Aufruf von

Code: Alles auswählen

RunShell("shell32.dll,OpenAs_RunDLL "+cFile,"Rundll32.exe")
geöffnet wurde?
naja eigendlich verwendet man den OpenAs doch wenn man sich "nicht" darum kümmern will.

wenn du es wirklich wissen will dann musst du durch die Registry. Beispiel *.prg

1.) suche nach ".prg" -> HKEY_CLASSES_ROOT\.PRG -> Wert "Prgfile"
2.) suche nach Wert "PrgFile" -> HKEY_CLASSES_ROOT\prgfile
3.) nun bis nach HKEY_CLASSES_ROOT\prgfile\shell\open\command

-> C:\ALASKA\XPPW32\Bin\vx20.exe "%1"

bei mir öffnet sich also VX wenn ich auf ein *.PRG im Explorer klicke oder es mit OpenAs starte.
gruss by OHR
Jimmy
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: öffnen mit: Programm abfragen

Beitrag von stevie »

Der Grund ist, dass ich Dokumente mit dem Standardprogramm öffne und, falls keins vorhanden war, dann den Öffnen mit-Dialog starte. Um zu prüfen, ob das geöffnete Programm noch läuft, muss ich mir den Programmnamen abspeichern, den ich aber bei Öffnen mit (und spätestens, wenn "Diesen Dateityp immer immer mit dem Programm öffnen" nicht angeklickt wurde, weiß ich natürlich nicht, welches nun gestartet wurde.
Viele Grüße
Stevie
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: öffnen mit: Programm abfragen

Beitrag von stevie »

Also wenn man das Häkchen ("immer mit dem Programm öffnen") anklickt, such ich einfach mit meiner Findexe() noch einmal nach dem Standardprogramm, falls nicht, habe ich zwei Registryschlüssel entdeckt.

Code: Alles auswählen

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.qxx
HKEY_USERS\S-1-5-21-1232814754-3171723120-2917556295-16556\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.qxx

// .qxx ist der Testdateityp
Da gibt es einen Schlüssel "OpenWithlist".
a Wordpad.exe
b notepad.exe
MRUList ba

Aus Mrulist ergibt sich, dass das Programm zuletzt mit notepad.exe gestartet wurde, da sobald ich die Datei mit Wordpad öffne, in der MRUlist ab steht. Jetzt ergibt sich mir die Frage:
Welcher Schlüssel ist sicherer? (in beiden steht eigentlich immer dasselbe drin)
Gibts irgendwelche ApiFunktionen, die diese Werte zurückgeben? (damit ich nicht erst in der Registry lesen muss)
Viele Grüße
Stevie
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: öffnen mit: Programm abfragen

Beitrag von Lewi »

Es gibt eine entsprechende API-Funktion:

Code: Alles auswählen

DLLFUNCTION FindExecutableA ( cFile, cDir, cProg ) USING STDCALL FROM SHELL32.DLL

Kontanten
/*
ERROR_OUT_OF_MEM 	&H0 	Nicht genügend Arbeitsspeicher.
ERROR_FILE_NOT_FOUND 	&H2 	Die angegebene Datei wurde nicht gefunden.
ERROR_PATH_NOT_FOUND 	&H3 	Der angegebene Pfad wurde nicht gefunden.
ERROR_BAD_FORMAT 	&HB 	Die .exe Datei ist keine gültige Microsoft Win32 .exe.
SE_ERR_ACCESSDENIED 	&H5 	Der Zugriff wurde auf die angegebene Datei verweigert.
SE_ERR_ASSOCINCOMPLETE 	&H1B 	The file name association is incomplete or invalid.
SE_ERR_DDEBUSY 	&H1E 	The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL 	&H1D 	The DDE transaction failed.
SE_ERR_DDETIMEOUT 	&H1C 	The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND 	&H20 	Die angegebene DLL Datei wurde nicht gefunden.
SE_ERR_FNF 	&H2 	Die angegebene Datei wurde nicht gefunden.
SE_ERR_NOASSOC 	&H1F 	Es ist keine Anwendung für die Dateierweiterung der angegeben Datei verknüpft. Der Fehler wird auch zurückgegeben, wenn man versucht, eine Datei zu drucken, die nicht gedruckt werden kann.
SE_ERR_OOM 	&H8 	Es steht nicht genügend Arbeitsspeicher zur Verfügung, um den Vorgang zu beenden.
SE_ERR_PNF 	&H3 	Der angegebene Pfad existiert nicht.
SE_ERR_SHARE 	&H1A 	Eine Zugriffsverletzung ist aufgetreten.
*/
 

Func GetStandardProg( cFile )
   Local nRet
   Local cPuffer := NIL
  nRet := FindExecutableA( cFile , "", cPuffer)
  do case
      case nRet == 0
             Msgbox("Nicht genügend Speicher vorhanden")
      case nRet == 31
            Msgbox("Für die Datei: " + cFile + " existiert keine verknüpfte Anwendung") 
     case ERROR_FILE_NOT_FOUND
     case ERROR_PATH_NOT_FOUND
    usw.. 
    OTHERWISE
     Msgbox("Die verknüpfte Anwendung ist: " + cPuffer  )

 Return ( was_auch_immer) )
  
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: öffnen mit: Programm abfragen

Beitrag von stevie »

Lewi hat geschrieben:Es gibt eine entsprechende API-Funktion:

Code: Alles auswählen

DLLFUNCTION FindExecutableA ( cFile, cDir, cProg ) USING STDCALL FROM SHELL32.DLL

Kontanten
/*
ERROR_OUT_OF_MEM 	&H0 	Nicht genügend Arbeitsspeicher.
ERROR_FILE_NOT_FOUND 	&H2 	Die angegebene Datei wurde nicht gefunden.
ERROR_PATH_NOT_FOUND 	&H3 	Der angegebene Pfad wurde nicht gefunden.
ERROR_BAD_FORMAT 	&HB 	Die .exe Datei ist keine gültige Microsoft Win32 .exe.
SE_ERR_ACCESSDENIED 	&H5 	Der Zugriff wurde auf die angegebene Datei verweigert.
SE_ERR_ASSOCINCOMPLETE 	&H1B 	The file name association is incomplete or invalid.
SE_ERR_DDEBUSY 	&H1E 	The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed.
SE_ERR_DDEFAIL 	&H1D 	The DDE transaction failed.
SE_ERR_DDETIMEOUT 	&H1C 	The DDE transaction could not be completed because the request timed out.
SE_ERR_DLLNOTFOUND 	&H20 	Die angegebene DLL Datei wurde nicht gefunden.
SE_ERR_FNF 	&H2 	Die angegebene Datei wurde nicht gefunden.
SE_ERR_NOASSOC 	&H1F 	Es ist keine Anwendung für die Dateierweiterung der angegeben Datei verknüpft. Der Fehler wird auch zurückgegeben, wenn man versucht, eine Datei zu drucken, die nicht gedruckt werden kann.
SE_ERR_OOM 	&H8 	Es steht nicht genügend Arbeitsspeicher zur Verfügung, um den Vorgang zu beenden.
SE_ERR_PNF 	&H3 	Der angegebene Pfad existiert nicht.
SE_ERR_SHARE 	&H1A 	Eine Zugriffsverletzung ist aufgetreten.
*/
 

Func GetStandardProg( cFile )
   Local nRet
   Local cPuffer := NIL
  nRet := FindExecutableA( cFile , "", cPuffer)
  do case
      case nRet == 0
             Msgbox("Nicht genügend Speicher vorhanden")
      case nRet == 31
            Msgbox("Für die Datei: " + cFile + " existiert keine verknüpfte Anwendung") 
     case ERROR_FILE_NOT_FOUND
     case ERROR_PATH_NOT_FOUND
    usw.. 
    OTHERWISE
     Msgbox("Die verknüpfte Anwendung ist: " + cPuffer  )

 Return ( was_auch_immer) )
  
ja nee ist schon klar, aber das würde ja nichts bringen, wenn man im "Öffnen mit"-Dialog, das Häkchen nicht setzt.
Viele Grüße
Stevie
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: öffnen mit: Programm abfragen

Beitrag von stevie »

Hab mir jetz ne kleine Xclass-Funktion für diesen Fall geschrieben.
Fall: Kein Standard-Programm verknüpft und Öffnen mit ohne Standardzuweisung verlassen.

Code: Alles auswählen

Function getLastOpenedProgram(cFileExt) // gibt letzten Programmnamen einer Dateiendung aus
  local cPrg, oRegistry ,nRet

  oRegistry:=dsRegistry():new(HKEY_CURRENT_USER)
  nRet:=oRegistry:OpenKey("Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\."+cFileExt+"\OpenWithList")
  if !empty(nRet)
     return ""
  endif
  cPrg:=oRegistry:GetValue(,Substr(oRegistry:GetValue(,"MRUList"),1,1))
  oRegistry:CloseKey()
  if empty(cPrg)
     return ""
  endif

return cPrg
Zur übergebenen Dateiendung (z.B. "prg") wird nun das zuletzt ausgeführte Programm ausgegeben, also bei mir "vx20.exe".
Viele Grüße
Stevie
Benutzeravatar
Lewi
1000 working lines a day
1000 working lines a day
Beiträge: 830
Registriert: Di, 07. Feb 2006 14:10
Wohnort: Hamburg
Danksagung erhalten: 2 Mal

Re: öffnen mit: Programm abfragen

Beitrag von Lewi »

ja nee ist schon klar, aber das würde ja nichts bringen, wenn man im "Öffnen mit"-Dialog, das Häkchen nicht setzt.
Ach, dass ist Dir klar? Warum dann die Frage, ob es eine Api-Funktion gibt, die die Standardanwendung zu einer Datei ermittelt?
Wenn es keine Standardanwednung gibt und ein "Häckchen" im entsprechenden Dialog für entsprechene Anwendung setzt, dann wird diese auch über die API-Funktion ermittelt. Falls es keine Standardanwendung gibt, hilft diese Funktion auch.
stevie
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 417
Registriert: Mo, 17. Sep 2007 18:20
Wohnort: Senftenberg
Kontaktdaten:

Re: öffnen mit: Programm abfragen

Beitrag von stevie »

Lewi hat geschrieben:
ja nee ist schon klar, aber das würde ja nichts bringen, wenn man im "Öffnen mit"-Dialog, das Häkchen nicht setzt.
Ach, dass ist Dir klar? Warum dann die Frage, ob es eine Api-Funktion gibt, die die Standardanwendung zu einer Datei ermittelt?
Wenn es keine Standardanwednung gibt und ein "Häckchen" im entsprechenden Dialog für entsprechene Anwendung setzt, dann wird diese auch über die API-Funktion ermittelt. Falls es keine Standardanwendung gibt, hilft diese Funktion auch.
Naja ich fragte (zumindest als letztes) nach einer Api-Funktion, die mir, falls es kein Standard-Programm gibt, das Programm zurückgibt, welches durch Öffnen mit ohne Häkchen gestartet wurde, also ein Synonym für meine "in der MRUliste suchen"-Funktion.
Entschuldige meine komplizierte Ausdrucksweise.
Viele Grüße
Stevie
Antworten