und wieder mal ein Problem.
Kann man herausfinden mit welchem Programm eine Datei beim Aufruf von
Code: Alles auswählen
RunShell("shell32.dll,OpenAs_RunDLL "+cFile,"Rundll32.exe")
Moderator: Moderatoren
Code: Alles auswählen
RunShell("shell32.dll,OpenAs_RunDLL "+cFile,"Rundll32.exe")
naja eigendlich verwendet man den OpenAs doch wenn man sich "nicht" darum kümmern will.stevie hat geschrieben:und wieder mal ein Problem.
Kann man herausfinden mit welchem Programm eine Datei beim Aufruf vongeöffnet wurde?Code: Alles auswählen
RunShell("shell32.dll,OpenAs_RunDLL "+cFile,"Rundll32.exe")
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
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.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) )
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
Ach, dass ist Dir klar? Warum dann die Frage, ob es eine Api-Funktion gibt, die die Standardanwendung zu einer Datei ermittelt?ja nee ist schon klar, aber das würde ja nichts bringen, wenn man im "Öffnen mit"-Dialog, das Häkchen nicht setzt.
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.Lewi hat geschrieben:Ach, dass ist Dir klar? Warum dann die Frage, ob es eine Api-Funktion gibt, die die Standardanwendung zu einer Datei ermittelt?ja nee ist schon klar, aber das würde ja nichts bringen, wenn man im "Öffnen mit"-Dialog, das Häkchen nicht setzt.
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.