Welche Gründe könnte ShellExecute nicht?
Ich habe eine VB6-Anwendung öffnet Dateien, die mit Ihr verbundenen Anwendung mit:
ShellExecute(0, "open", filename, params, vbNullString, vbNormalFocus)
Dieser funktioniert perfekt.
Nun habe ich einen Kunden (läuft XP mit Adobe Reader), der kann nicht öffnen Sie eine PDF-Datei mit obigem Befehl. Aber die gleiche Datei wird geöffnet, ohne dass irgendwelche Probleme beim Doppelklick aus dem Windows Explorer. Ich habe auch getestet, den Dateinamen/-Pfad-Kombination auf meinem Rechner, um auszuschließen, diese Art von Problemen.
Ich bin auf der Suche nach irgendwelche Tipps, was ich überprüfen könnte, um sicherzustellen ShellExecute
arbeitet. Oder was kann die Ursache ShellExecute zu scheitern, auf diese Weise?
Ich bin neugierig, warum Sie sind das hinzufügen vbNullString an den Dateinamen an. Gibt es dafür einen Grund? Jede änderung, wenn Sie nicht verwenden?
Ich denke, das hinzufügen von 'vbNullString' an das Ende der Saiten ist nicht notwendig. Allerdings, wenn ich mich Irre, müssten Sie hinzufügen, um die "Öffnen" als gut.
Es ist nicht wirklich nötig. Nur zugegeben, es einige Tage und jetzt ist es immer noch da. Dann habe ich es wegen der Dokumentation sagen die Funktion ist unter null-terminierte " strings.
Ich entfernte Sie, es macht den code lesbarer zu gestalten.
Nicht nur, vbNullString nicht ein NUL-Zeichen (werden Sie wahrscheinlich wollen, vbNullChar), alle VB String-Werte sind NUL-terminiert intern sowieso schon. Ist "Dateinamen" einen voll qualifizierten Pfad? Was ist in "params" (und warum sind Sie vorbei, es überhaupt)? Aber ich Stimme zu, dass der Rückgabewert sollte beweisen, sinnvoll.
Ich denke, das hinzufügen von 'vbNullString' an das Ende der Saiten ist nicht notwendig. Allerdings, wenn ich mich Irre, müssten Sie hinzufügen, um die "Öffnen" als gut.
Es ist nicht wirklich nötig. Nur zugegeben, es einige Tage und jetzt ist es immer noch da. Dann habe ich es wegen der Dokumentation sagen die Funktion ist unter null-terminierte " strings.
Ich entfernte Sie, es macht den code lesbarer zu gestalten.
Nicht nur, vbNullString nicht ein NUL-Zeichen (werden Sie wahrscheinlich wollen, vbNullChar), alle VB String-Werte sind NUL-terminiert intern sowieso schon. Ist "Dateinamen" einen voll qualifizierten Pfad? Was ist in "params" (und warum sind Sie vorbei, es überhaupt)? Aber ich Stimme zu, dass der Rückgabewert sollte beweisen, sinnvoll.
InformationsquelleAutor MicSim | 2009-07-28
Du musst angemeldet sein, um einen Kommentar abzugeben.
Was ist der Rückgabewert von ShellExecute? Wenn es 0x0000001f (== 31, was bedeutet
SE_ERR_NOASSOC
), als nach shellapi.h "Es ist keine Anwendung zugeordnetdie angegebene Datei Namen Erweiterung"., das bedeutet, dass sich irgendwie die Registrierung der .pdf-Datei-Erweiterung verloren haben. Neuinstallation von Adobe Reader helfen könnte.
Kann es sein, dass Explorer verwendet einige COM-voodoo 😉
Es gibt mindestens zwei Möglichkeiten, die windows verwendet, um zu entscheiden, welche app zu nennen, für welche Datei-Erweiterung: Diejenigen, die gültig sind für alle Benutzer auf dem Computer, und diejenigen, die einen bestimmten Benutzer gebunden. Vielleicht ist der user fummelte mit der pdf-Datei Verbände (Explorer: Ordneroptionen - Dateitypen).
Leider habe ich nicht den Rückgabewert und können es nur nach Installation einer neuen version an die clients Maschine. Aber zumindest könnte ich schlage vor, die Neuinstallation von Adobe Reader.
InformationsquelleAutor Thomas Freudenberg
Weiter zu Thomas Antwort, hier einige VB6-Konstanten für die möglichen Rückgabewerte von ShellExecute, mit möglichen Erklärungen (ich glaube, ich nahm ursprünglich diese aus der MSDN Seite, zurück Wert Abschnitt). Ein return-Wert von 32 oder weniger bedeutet, dass der Aufruf fehlgeschlagen ist. Der spezifische Wert zurückgegeben, der angibt, was falsch gelaufen ist.
InformationsquelleAutor MarkJ
Haben Sie "öffnen" als verb, nicht, vbNullString als verb ("sich Öffnen" bedeutet, dass die open-verb, NULL bedeutet, dass die Standard-verb (Sofern der Benutzer nicht eine bestimmte Standard, der Standard geöffnet ist, wenn es keine offenen verb für diesen Dateityp, die ShellExecute verwendet das erste verb findet es))
Das ist Ihre Wahl. Es ist besser, als mit einem verb, das möglicherweise nicht existiert. Wenn Sie wollen das beste aus beiden Welten, könnte man prüfen, ob das open-verb existiert zuerst, und wenn es nicht, verwenden Sie NULL (Aber auf diese Weise Sie wirklich sind, Schrauben Sie Ihre Nutzer, da Sie einen Standard und Sie ignoriert es)
Auch die Frage beginnt mit "Die Gründe" und das ist ein triftiger Grund, so verstehe ich nicht, warum Sie Stimmen mir runter. (Ich habe gesehen, dieses problem in der wildnis)
Ich wusste nicht, Stimmen Sie unten. Jemand anderes muss mochte Ihre Antwort. Ich habe gerade einen Kommentar hinterlassen auszudrücken meine Zweifel.
wollte damit nicht zum Ziel, Sie direkt.
InformationsquelleAutor Anders
Haben Sie einen Blick auf die return-Wert Ihrer
ShellExecute
nennen. Aus der MSDN:InformationsquelleAutor Treb
Anstelle der Verwendung von ShellExecute 'execute' der PDF-Datei benutze ich die API-FindExecutable:
FindExecutable funktioniert, finden Sie das Programm registriert ist, führen Sie auf Basis einer gegebenen Datei-Erweiterung. ShellExecute ist ideal für einen Task und warten Sie, rufen Sie an (anstelle von nur Shell), aber es scheint, eine brute-force-Methode der Ausführung, die manchmal zu einem Fehler führt. Ich verwendete vbnet.mvps.org/index.html?code/system/findexecutable.htm als meine Quelle. Es ist eine fantastische Ressource für VB-6-API Nutzung.
InformationsquelleAutor C-Pound Guru
Wenn Sie
in deinem code, dann müssen Sie erstellen Sie einen separaten thread für die Ausführung über
ShellExecute.
Weitere Informationen finden Sie hier: Aufruf von Shell-Funktionen und Schnittstellen aus einem Multithread-Apartment
InformationsquelleAutor Mihaela
Können Sie kopieren Dateien aus dem usernamex Ordner auf den neuen Benutzernamen-Ordner (Desktop, Dokumente, etc.)
InformationsquelleAutor layze
Ich habe das gleiche problem und es war nicht möglich, ändern Sie die VB6-Code. Also musste ich eine andere Lösung finden...
In meinem Fall war es eine Datei mit der Endung ".xyz", aber in Wirklichkeit war es eine Datei für Microsoft Word, wie ein .doc-Datei.
Beim Doppelklick zum ersten mal, Windows fragt nach einem programm zum öffnen der Datei mit. Nach, dass der doubleclick funktioniert gut. Aber die ShellExecute nicht. Das problem ist, dass die ShellExecute ausführt, eine "Rechtsklick" -> "öffnen" auf die Datei und "öffnen" nicht vorhanden ist in dem Kontextmenü auf meinem .xyz-Datei. Es war nur ein "edit"... So die ShellExecute arbeitete mit "Bearbeiten", aber nicht mit "öffnen" als zweiten parameter.
War und weil ich mich nicht in der Lage, ändern Sie die VB6-code, öffnete ich die registry mit regedit. In der Weg "HKEY_CLASSES_ROOT\.doc" standard-Wert "zu Wort.Dokument.8", in "HKEY_CLASSES_ROOT\.xyz - " es war einfach "xyz_auto_file". Also habe ich einfach diesen Wert in " - Wort.Dokument.8", und alles funktionierte perfekt. Jetzt habe ich das gleiche Kontext-Menü wie mit einem .doc-Datei, wenn ich mit der rechten Maustaste klicken Sie auf meine .xyz-Datei.
Und auch die ShellExecute funktioniert perfekt...
InformationsquelleAutor user3256508
Ich hatte das gleiche Problem mit einem vorhandenen Programm, das mit dem verb
open
stattNULL
beim aufrufen der ShellExecute Funktion. Ich war in der Lage, das problem zu beheben, indem dieopen
verb wie hier beschrieben mit dem Registrierungs-editor in der.pdf
hf (bei mir war das beiHKEY_CLASSES_ROOT\pdf_auto_file
). Ich denke, das ist ein problem in der Adobe Reader installer, der ist manchmal nicht hinzufügen dieopen
verb während der installation.Hier ist der export der registry-Werte, die ich Hinzugefügt:
InformationsquelleAutor Martin
Ich hatte das gleiche problem wie der OP innerhalb einer kompilierten Visual Foxpro 9 Anwendung nach dem Update von W7x64 auf W10 öffentlichen release.
Ich habe Adobe Acrobat sowie Adobe Reader. Ändern Sie die Standardeinstellung .pdf association von Reader, Acrobat und... Es funktioniert alles! Wechsel zurück zum Reader mit original-Fehler (Fehler-code 31 - "Es ist keine Anwendung mit der angegebenen Datei-Namen-Erweiterung."). Schlägt mich, aber zum Glück habe ich mir keine sorgen zu machen. Ich bin zu alt, zu pflegen und erfordern alle Standorte bleiben mit W7.
Entweder Verein arbeitet aus dem Datei-explorer
InformationsquelleAutor Geriatrix
Aufruf einer Unicode-version (ShellExecuteW) aus einem Befehl unterstützt nur ANSII, der Erfahrung mit einer aktuellen version von Inno Setup. ShellExecuteW arbeitete für einige ANSII-string-Argumente, aber in diesem Fall nicht erforderlich, die Rückkehr 2 (siehe unten).
Als eine Angelegenheit von Interesse, entweder in ANSII-oder Unicode-Inno-internen Funktion ShellExec auch nicht mit code 5 für den Grund der Zusammenstellung Prozess hatte immer noch ein offenes handle auf die Datei.
InformationsquelleAutor Laurie Stearn
Hier ist eine Funktion, die übersetzt einen windows-Fehler-Nummern auf text. Sie können mit der return-Wert als parameter und erhalten wieder eine freundliche Nachricht.
InformationsquelleAutor jac
Versuchen.
Sie haben die Zuordnung der PDF-Datei mit einem beliebigen Programm (z.B. Acrobat x), um PDF-Dateien Lesen, dann können Sie das öffnen von PDF-Dateien mit ShellExecute.
InformationsquelleAutor Wilson Arguello