Seite 1 von 1

öffnen mit: Programm abfragen

Verfasst: Mi, 20. Mai 2009 13:50
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?

Re: öffnen mit: Programm abfragen

Verfasst: Do, 21. Mai 2009 8:54
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.

Re: öffnen mit: Programm abfragen

Verfasst: Do, 21. Mai 2009 17:21
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.

Re: öffnen mit: Programm abfragen

Verfasst: Di, 02. Jun 2009 10:35
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)

Re: öffnen mit: Programm abfragen

Verfasst: Di, 02. Jun 2009 12:40
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) )
  

Re: öffnen mit: Programm abfragen

Verfasst: Di, 02. Jun 2009 14:04
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.

Re: öffnen mit: Programm abfragen

Verfasst: Di, 02. Jun 2009 14:32
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".

Re: öffnen mit: Programm abfragen

Verfasst: Di, 02. Jun 2009 15:14
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.

Re: öffnen mit: Programm abfragen

Verfasst: Di, 02. Jun 2009 16:11
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.