Entwickler-Ecke

Windows API - ShellExecute öffnet nur manche Dateiformate


Xion - Di 23.01.07 13:11
Titel: ShellExecute öffnet nur manche Dateiformate
Hi

ich hab irgendwie hier ein seltsames Problem. Ich hab Win2k und bentutze ShellExecute zum Dateiöffnen. Seit neuestem funktioniert das aber nichtmehr richtig. Hatte erst ein Programm, daraus hab ich z.B. dpr-Dateien gestartet. Habs umgebaut-geht nichtmehr. So weit, so gut. Nur leider liegts nicht dran, dass ich das Programm geändert habe. Hab von nem Backup die alte Version gestartet. Ergebnis: geht nicht mehr. er kann keine dpr (und auch keine txt, dat usw.) öffnen. ABER: er kann xar, bmp, pdf usw. öffnen!? Wo ist da jetzt der Fehler? es müsste ja mit Win zusammenhängen. Ich hab auch schon das ShellExecute in ein andres Programm gebaut, gleicher Fehler.

Da frag ich euch als erfahrene Computer-Freaks: Woran liegts? Meiner Meinung nach eher an Windoof, aber das hilft mir leider auch nicht weiter.

XION

//HINWEIS: Es kommt KEINE Fehlermeldung, Result von ShellExecute ist 31

Zitat:

Ist keine Zuordnung für den angegebenen Dateitypen oder besteht keine Zuordnung für die angegebene Aktion innerhalb des Dateitypen, gibt die ShellExecute() Funktion den Wert 31 zurück.


Delete - Di 23.01.07 13:24

Das ist doch der Fehler. :? Es ist anscheinend keine Anwendung oder Aktion mit dem Dateityp verknüpft.

Kannst du die besagten Dateien denn per Doppelklick aus dem Explorer öffnen?


Xion - Di 23.01.07 13:28

ja (mal von dat abgesehen) mit txt würd ichs auch noch verstehen, weil ich da ein Prog selbst geschrieben habe, aber dpr kann ich klar so öffnen (is ja das Delphi-Format). Außerdem hat er sonst immer das Programm-Auswahl-Fenster angezeigt, wenn er kein entsprechendes Programm zum Öffnen gefunden hat.

//EDIT: Nochma gecheckt, jetzt ist das Result 3...

Zitat:

Path was not found.

sicher nicht...

und bei dprs ist es
Zitat:

File was not found

stimmt doch gar nicht :bawling: (oder doch *such*)

die dateien sind aber da, wo der Pfad "hinzeigt"...


RainerO - Di 23.01.07 13:56

Hm - kann das evtl. mit den Pfad- oder Dateinamen (mit Leerzeichen) zusammenhängen?
Wenn die Zuweisung in der Registry zb bei unserem Programm (Endung .pdp) -unter HKLM\Software\Classes\RPWProjectFile\Shell\open\command =[c:\RLW.Mobil\binrpw\rpw20.exe "%1"]
steht, geht es immer, wenn da nur ...rpw20.exe %1 steht, ging es nur bei Pfad-Dateinamen OHNE Leerzeichen darin.
Hast Du die doppelclicks auf dieselben dateien versucht oder auf andere Beispiele?
Es scheint aber auf jeden Fall mit den Dateiregistrierungen zu tun zu haben - probier Dein Prog doch mal auf einem anderen PC aus.


Xion - Di 23.01.07 14:11

Hi,

mit Leerzeichen hats nichts zu tun :( und ich hab auch genau die Dateien per doppelklick probiert wie im Programm.
auf nem andren Rechner, das wär ne Idee, weil da müssts ja gehen, weil ShellExecute mit dpr ging ja bei mir vorher auch...mal gucken...(hab grad keine Zeit, später dann)


evofan - Di 23.01.07 23:32

ich hab keine antwort auf deine frage, wollt dich was fragen, wie du das mit dem ShellExecute machst, also was im quelltext steht!
wäre nett wenn du mir den mal zeigen könntest denn ich versuch auch grad so nen programm hinzukriegen, wo man aus delphi andere programme öffnen kann
Danke im Vorraus!!!!!!
mfg EVOFAN


jaenicke - Mi 24.01.07 00:20

@user profile iconevofan:
Erstmal :welcome: hier im Forum!
Und was die Frage nach ShellExecute angeht:
Es gibt hier im Forum auch eine Suche! Und die hätte dir zu ShellExecute sehr viele Ergebnisse mit einigem Code geliefert ;-). Unter anderem dieses:
http://www.delphi-library.de/viewtopic.php?sid=333cb42e682907ef5b41b08cf8a23ef8&t=2887&highlight=shellexecute
Wichtig: IMMER den absoluten Pfad mit angeben.
Mehr zu ShellExecute direkt von MS:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/shellcc/platform/shell/reference/functions/shellexecute.asp


Zurück zum Thema:
Folgender Vorschlag:
Sieh doch mal nach, was in der Registry unter HKEY_CLASSES_ROOT\.txt bei (Standard) steht. Dieser Wert (meistens txtfile) müsste dann als Schlüssel ebenfalls unter HKEY_CLASSES_ROOT stehen (wie .txt). Klick auf diesen Schlüssel mal mit rechts drauf und dann auf exportieren. Dann wird der komplette Inhalt in eine Datei gespeichert. Öffne die mit einem Editor (im Kontextmenü vom Explorer Bearbeiten) und poste den Inhalt hier.

Da sehen wir ja dann ob da alles in Ordnung ist oder ob da ein Fehler ist... ;-)
Bei .txt kann zwar eigentlich nicht viel falsch sein, aber mal sehen.

Ja, und den Code solltest du vielleicht auch posten, auch wenn da ja eigentlich nicht viel falsch sein kann...


Xion - Mi 24.01.07 16:22

Also:

der Code:

Delphi-Quelltext
1:
 ShellExecute(Application.handle, 'open', PChar(FileName), nilnil, SW_SHOW); //@evofan: ShellAPI einbinden                    


so, ich glaub ich hab den Fehler an sich gefunden:
Bei allen Dateien, die nicht zu öffnen sind, sagt Windoof unter Eigenschaften "unbekannte Anwendung". Trotzdem malt er das Bildchen richtig hin, und doppelklick funzt auch. Wenn ich z.B. bei txt auf WordPad umschalte, dann steht da WordPad drinne, wenn ich mein eignes nehme, unbekannte Andwendung. Mit Wordpad kann ichs auch per ShellExecute öffnen. Außerdem löscht er auch immer mein Prog aus der "Öffnen mit"-Liste...wie soll ich das jetzt zum laufen bringen...


Xion - Do 25.01.07 19:47


Registry Schnipsel
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
[HKEY_CLASSES_ROOT\.txt]
@="txtfile"
"Content Type"="text/plain"

[HKEY_CLASSES_ROOT\.txt\OpenWithProgIDs]
"opendocument.WriterDocument.1"=" "
"opendocument.CalcDocument.1"=" "

[HKEY_CLASSES_ROOT\.txt\PersistentHandler]
@="{5e941d80-bf96-11cd-b579-08002b30bfeb}"

[HKEY_CLASSES_ROOT\.txt\ShellEx]

[HKEY_CLASSES_ROOT\.txt\ShellEx\{BB2E617C-0920-11d1-9A0B-00C04FC2D6C1}]
@="{EAB841A0-9550-11cf-8C16-00805F1408F3}"

[HKEY_CLASSES_ROOT\.txt\ShellNew]
"NullFile"=""

[...]


[HKEY_CLASSES_ROOT\txtfile]
@="Textdatei"

[HKEY_CLASSES_ROOT\txtfile\DefaultIcon]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,73,00,68,00,\
  65,00,6c,00,6c,00,33,00,32,00,2e,00,64,00,6c,00,6c,00,2c,00,2d,00,31,00,35,\
  00,32,00,00,00

[HKEY_CLASSES_ROOT\txtfile\shell]

[HKEY_CLASSES_ROOT\txtfile\shell\open]

[HKEY_CLASSES_ROOT\txtfile\shell\open\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,25,00,31,00,00,\
  00

[HKEY_CLASSES_ROOT\txtfile\shell\print]

[HKEY_CLASSES_ROOT\txtfile\shell\print\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,4e,00,4f,00,\
  54,00,45,00,50,00,41,00,44,00,2e,00,45,00,58,00,45,00,20,00,2f,00,70,00,20,\
  00,25,00,31,00,00,00

[HKEY_CLASSES_ROOT\txtfile\shell\printto]

[HKEY_CLASSES_ROOT\txtfile\shell\printto\command]
@=hex(2):25,00,53,00,79,00,73,00,74,00,65,00,6d,00,52,00,6f,00,6f,00,74,00,25,\
  00,5c,00,73,00,79,00,73,00,74,00,65,00,6d,00,33,00,32,00,5c,00,6e,00,6f,00,\
  74,00,65,00,70,00,61,00,64,00,2e,00,65,00,78,00,65,00,20,00,2f,00,70,00,74,\
  00,20,00,22,00,25,00,31,00,22,00,20,00,22,00,25,00,32,00,22,00,20,00,22,00,\
  25,00,33,00,22,00,20,00,22,00,25,00,34,00,22,00,00,00


jaenicke - Fr 26.01.07 09:18

Genau da liegt der Fehler! Bei dir steht jetzt unter shell\open\command
Zitat:
%SystemRoot%\system32\NOTEPAD.EXE %1

Wenn jetzt in der Datei ein Leerzeichen drin ist, dann sieht das Kommando so aus:

Quelltext
1:
%SystemRoot%\system32\NOTEPAD.EXE c:\my folder\xy.txt                    

c:\my existiert aber nicht, ist aber der erste übergebene Parameter (und folder\xy.txt ein weiterer)...

Richtig ist es so:

Quelltext
1:
%SystemRoot%\system32\NOTEPAD.EXE "%1"                    

Dabei kommt dann das raus:

Quelltext
1:
%SystemRoot%\system32\NOTEPAD.EXE "c:\my folder\xy.txt"                    

Der gesamte Pfad mit Leerzeichen ist ein Parameter...


Xion - Fr 26.01.07 15:31

thx

hört sich logisch an, aber:

a) vorher hats ja schonmal funktioniert, hat Win da in der Reg was geändert?
b) obwohl ich jetzt Anführungszeichen um das %1 in der Registry gemacht habe steht immernoch "unbekannte Anwendung" in den Eigenschaften und ich kanns nicht öffnen

//Edit: wenns was mit den Leerzeichen zu tun hat, dann will ich mich gleichmal bei euch und v.a. bei RainerO entschuldigen :flehan:


jaenicke - Fr 26.01.07 16:17

Ja, keine Ahnung, bei mir sind in der Registry welche drum... Aber es funktioniert auch ohne, wie ich grad gemerkt habe. Ich hab die einfach mal weggemacht.

Ich werd mal alle deine Registry-Einträge übernehmen (habs bisher nur manuell verglichen ;-))...


Xion - Fr 26.01.07 16:36

thx.

es ist ja auch so, wenn ich z.B. "Ultima Online Samurai Empire" starte, dann sind da massig Leerzeichen drin, aber es funktioniert (weils eine exe ist...da sind aber auch Anführungszeichen drin ("%1" %* ))


Xion - Sa 27.01.07 11:48

Mir ist aufgefallen, dass er meine pas-Dateien als unbekanntes Format anzeigt, d.h. bei doppelklick kommt das "Öffnen mit" Fenster... :roll: ...könnte es evtl damit zu tun haben, dass ich unter Taskleiste/Eigenschaften/Erweitert auf den Löschen-Knopf gedrückt hab...da steht "Klicken Sie auf die Schalftfläche "Löschen" um Dokumente, Programme und Websites zu löschen, auf die Sie vor kurzem zugegriffen haben"...damit wollt ich den Verlauf löschen, hat auch geklappt, aber theorethisch könnts sein, dass daran auch der Fehler mit den Dateien kommt...