Vista: Fehler beim Programmaufruf
Moderators: Hacker, Stefan2, white
Sorry, nicht das ich jetzt hier den Thread durcheinander gebracht habe.ghisler(Author) wrote: 2HolgerK
Doch , eigentlich schon!
Eventuell geht es ja, wenn Sie den Binärwert löschen, und anschliessend einen neuen Stringwert mit diesem Inhalt anlegen?
Bei mir funktioniert es unter WindowsXP ausgezeichnet. Mein Kommentar betraf nur Ihre Aussage "Das ist aber ein hexadezimaler Binärwert und kein String. Deshalb kommt TC wohl nicht weiter...".
Ein REG_EXPAND_SZ ist ein String! Und das klappt auch ohne Probleme mit dem TC.
Wenn allerdings -wie vorgeschlagen- eine Enviromentvariable in einem REG_SZ untergbracht wird, dann klappt es nicht mehr im TC, allerdings noch im Explorer. Das ist allerdings eine andere Sache.
Das eigentliche Problem scheint mir eher hier zu liegen:
In XP sah das Ganze nämlich noch so aus:tzi ,am: Di Jan 30, 2007 20:14 wrote:Code: Select all
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi] [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\OpenWithList] "a"="TOTALCMD.EXE" "MRUList"="ab" "b"="mplayerc.exe" [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\OpenWithProgids] "WMP11.AssocFile.AVI"=hex(0): [HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\UserChoice] "Progid"="Applications\\mplayerc.exe"
Code: Select all
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi]
@=""
"Application"="mplayerc.exe"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\OpenWithList]
"a"="wmplayer.exe"
"MRUList"="abc"
"b"="Winamp.exe"
"c"="mplayerc.exe"
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\OpenWithProgids]
"avifile"=hex(0):
"Winamp.File"=hex(0):
Code: Select all
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\UserChoice]
"Progid"="Applications\\mplayerc.exe"
Code: Select all
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi]
@=""
"Application"="mplayerc.exe"
Gruß,
Holger
-
- Junior Member
- Posts: 2
- Joined: 2007-01-11, 21:50 UTC
Oha, dachte schon ich wäre der einzige mit dem Problem
Ich hab bisher keine Lösung finden können, kann mich also leider nicht wirklich konstruktiv beteiligen. Ich kann aber als Alternative allen Betroffenen emfpehlen, zunächst mal einen anderen Media Player zu benutzen, mit VLC geht das ganze nämlich einwandfrei. Scheinbar ist es also Applikationsabhängig !?

- ghisler(Author)
- Site Admin
- Posts: 50386
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Seltsam, die Funktion ShellExecuteEx (welche der TC verwendet) hatte eigentlich nie Probleme mit Umgebungsvariablen in REG_EXPAND_SZ...Wenn allerdings -wie vorgeschlagen- eine Enviromentvariable in einem REG_SZ untergbracht wird, dann klappt es nicht mehr im TC
Leider kann ich dazu nicht viele Infos finden. Irgendwie scheint das mit .Net zu tun zu haben. Weiss jemand mehr?Dieser Key scheint unter Vista neu hinzugekommen zu sein:
Code:
[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.avi\UserChoice]
"Progid"="Applications\\mplayerc.exe"
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
Mit ShellExecuteEx habe ich es noch nicht ausprobiert, aber das folgende Beispiel:ghisler(Author) wrote:Seltsam, die Funktion ShellExecuteEx (welche der TC verwendet) hatte eigentlich nie Probleme mit Umgebungsvariablen in REG_EXPAND_SZ...
Code: Select all
#include "stdafx.h"
#include "Windows.h."
#include "shellapi.h"
#include "comdef.h"
long OpenDocument( char * pszDocumentName )
{
HINSTANCE h = ShellExecute( NULL, NULL, pszDocumentName, NULL, NULL, SW_SHOWNORMAL );
if( (long)h <= 32 )
{
_com_error ce( (long)h );
printf ( "ShellExecute(%s) failed!\n"
" ErrorCode:%d\n"
" ErrorString:%s\n"
, pszDocumentName
, (long)h
, ce.ErrorMessage()
);
}
else
printf ( "ShellExecute(%s) succeeded!\n"
, pszDocumentName
);
return (long)h;
}
int main( int /*argc*/, char* /*argv[]*/ )
{
#define BUF_SIZE 1024
CHAR szPath2FileExpanded[BUF_SIZE+1];
CHAR *pszPath2File ="%SystemRoot%\\clock.avi";
OpenDocument( pszPath2File );
::ExpandEnvironmentStrings( pszPath2File, szPath2FileExpanded, BUF_SIZE );
OpenDocument( szPath2FileExpanded );
getchar();
return 0;
}
Code: Select all
ShellExecute(%SystemRoot%\clock.avi) failed!
ErrorCode:2
ErrorString:Das System kann die angegebene Datei nicht finden.
ShellExecute(D:\WINDOWS\clock.avi) succeeded!
Also genau das, was der TC momentan nur mit dem Windows-Mediaplayer (oder, mit dem hier an anderer stelle genanten VLC) fehlerfrei vollbringt.
Ich schätzte mal, es klappt immer dann ohne Probleme, wenn ein Programm sich als Default in HKCR während des Setups einträgt. Aber wehe, der Anwender will das anschließend selber mit Boardmitteln ändern.
Da habe ich gestern unter Vista die wildesten Sachen beim Versuch die Registry zu ändern erlebt.
Der oben genannte Schlüssel "\UserChoice" weigert sich nämlich erfolgreich von mir (als User mit Adminrechten) gelöscht zu werden.
Erst das Zurücksetzten des WindowsMediaPlayers per Kontextmenu des Avi Files, stellte den Ursprungszustand im Zweig "HKCU...FileExts\.avi" wieder her. Man fühlt sich erstmal so, als ob man nicht mehr Herr im eigenen Haus ist.
<OT>Jetzt muss ich aber doch mal .Net verteidigen:ghisler(Author) wrote:Leider kann ich dazu nicht viele Infos finden. Irgendwie scheint das mit .Net zu tun zu haben. Weiss jemand mehr?
Nicht an allem ist .Net schuld.
Diesmal scheint es die "extendend user eXPerience" zu sein, oder das kooperative Nebeneinander mehrere Programme (die sich um Datei-Extensions prügeln), bei der MS mit Vista etwas verbessern will.
Ich will mich jetzt hier nicht allzu sehr darüber beklagen, sonst müsste ich auch konsequenterweise den bevorzugten Hersteller meines gewohnten Betriebssystems wechseln. Die Computerwelt ändert sich halt andauernd...
Man muss nicht alles gut finden, aber dann lernt man es doch mit der Zeit genauer kennen, und erkennt dann vielleicht auch gewisse Vorteile.
Das ist mir bis jetzt bei jedem Systemwechsel (DOS nach OS/2 > NT4 > Win2000 > WinXP) so ergangen, und irgendwann werde ich mich auch an die laminierten Plastikfenster von Vista gewöhnt haben

Der folgende Artikel liefert einige Hinweise auf die Gründe die zu einer Änderung in Vista geführt haben:
Default Programs
Hier ist eines der neuen Interfaces (Vista only) erklärt mit dem Programmassoziationen verwaltet werden:
IApplicationAssociationRegistration Interface
IApplicationAssociationRegistration::QueryCurrentDefault Method
Ich frage mich allerdings, ob es wirklich notwendig ist soweit in die Innereien des Betriebssystems(der Registry) einzutauchen, wenn man das Ziel auch mit einem einzigen ShellExecute() -unabhängig vom Betriebssystem- erreichen kann.
Mit freundlichem Gruß
Holger
Lösung?
Seid ja ganz schön am fachsimpeln.....
... aber gibt es denn auch schon eine Lösung für dieses Problem "Fehler beim Programmaufruf"? Is nämlich echt ganz schön schade, dass ich meine Videos nicht mehr über den TC starten kann.
Würde mich sehr freuen
Tschau
... aber gibt es denn auch schon eine Lösung für dieses Problem "Fehler beim Programmaufruf"? Is nämlich echt ganz schön schade, dass ich meine Videos nicht mehr über den TC starten kann.
Würde mich sehr freuen

Tschau
2Pille
Na ja, im Moment läuft grade der grösste Endkunden-Betatest der Welt (Ich meine den Stapellauf von WindowsVista
).
Änderungen im Betriebssystem laufen dann erstmal auf Kosten bestehender Programme, die dann mühsam angepasst werden müssen.
Bis dahin helfen vielleicht die folgende Workarounds:
1) Startmenu oder Button mit deinem bevorzugten Mediaplayer anlegen.
2) einen Mediaplayer installieren, der sich wie der Windowsmediaplayer in HKCR die Fileassoziationen ohne den "Öffnen als Default"-Kram beim Setup einträgt (da wurde bereits VLC gennannt).
Ich bin zuversichtlich das Christian Ghisler das Starten bei assoizierten Daeiextensions in einem der nächsten TC7-Betas zum laufen bekommt (einfach nur Vertrauen, ohne Insiderwissen).
Der TC-eigene "Dateien->Verknüpfen" Dialog wird, dank MS-Vista-Änderungen, wahrscheinlich ein schwerer Brocken sein.
Mit freundlichem Gruß,
Holger
Na ja, im Moment läuft grade der grösste Endkunden-Betatest der Welt (Ich meine den Stapellauf von WindowsVista

Änderungen im Betriebssystem laufen dann erstmal auf Kosten bestehender Programme, die dann mühsam angepasst werden müssen.
Bis dahin helfen vielleicht die folgende Workarounds:
1) Startmenu oder Button mit deinem bevorzugten Mediaplayer anlegen.
2) einen Mediaplayer installieren, der sich wie der Windowsmediaplayer in HKCR die Fileassoziationen ohne den "Öffnen als Default"-Kram beim Setup einträgt (da wurde bereits VLC gennannt).
Ich bin zuversichtlich das Christian Ghisler das Starten bei assoizierten Daeiextensions in einem der nächsten TC7-Betas zum laufen bekommt (einfach nur Vertrauen, ohne Insiderwissen).
Der TC-eigene "Dateien->Verknüpfen" Dialog wird, dank MS-Vista-Änderungen, wahrscheinlich ein schwerer Brocken sein.
Mit freundlichem Gruß,
Holger
- ghisler(Author)
- Site Admin
- Posts: 50386
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
Da können wir nur hoffen, dass Microsoft die Fehler in ShellExecute und ShellExecuteEx korrigiert... 

Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com
ghisler(Author) wrote:Da können wir nur hoffen, dass Microsoft die Fehler in ShellExecute und ShellExecuteEx korrigiert...

Ich bin mir da beinahe 100%tig sicher, das es auch mit einer im Path enthalten Enviromentvariable und gesetztem Maskierungsflag SEE_MASK_DOENVSUBST( in SHELLEXECUTEINFO) bei einem ShellExecuteEx-Aufruf funktionieren würde.
TC kommt aber bereits unter WindowsXP durcheinander, wenn in einem REG_SZ eine Enviromentvariable enthalten ist (Bei REG_EXPAND_SZ klappt es hingegen).
Das lässt mich erstmal vermuten, dass der Aufrufmechanismus innerhalb von TC etwas unnötig kompliziert (adaptiert an die die verschiedensten Windowsversionen?) ist, und zuviel Detailwissen über die Informationsablage in der Registry auswertet. Selbst eine geringe Änderung der Informationsablage innerhalb der Registry kann dann zu einem unerwarteteten Verhalten führen.
Und in Vista scheint es drastische Änderungen im privaten Explorer Zweig gegeben zu haben.
<OT> Ich bin gewiss kein Microsoftevangelist, aber manchmal wundere ich mich doch etwas über die Ressentiments gegenüber Microsoft.
Zugegeben, es ist manchmal frustrierend die Kompatibilität mit neueren Betriebssystemen(und deren Änderungen) zu erreichen, aber was will man anderes machen?
Die Hoffnung, dass der Berg zum Propheten kommt, habe ich mir in Bezug auf multinationale Konzerne abgewöhnt.
Nun ja ich bin allerdings auch kein Prophet

Mit freundlichem Gruß,
Holger
- ghisler(Author)
- Site Admin
- Posts: 50386
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
2ghisler(Author)
Da ich nur Vermutungen darüber anstellen kann, wie TC eine Dokumentendatei öffnet, kann ich höchsten auf das Beispiel mit ShellExecute verweisen. Es scheint recht zuverlässig unter XP und Vista das zum Dokumenttyp passend Programm zu veranlasst, die Dokumentdatei zu öffnen:
pszDoukmentName war in diesem Beispiel der Name der AVI-Datei : "D:\WINDOWS\clock.avi"
Es ist also nicht notwendig zu wissen, welches Programm das Dokument öffnet, oder wo dieses Programm im System liegt.
Einzig der Name und das (absolute!)Verzeichnis des Dokumentes reicht in diesem Fall aus.
Wenn eine solche Änderung von Ihnen als zu großes Risiko angesehen wird, dann besteht ja immer noch die Möglichkeit diese Methode nur als Fallback für die momentane Implementierung vorzusehen.
Mit freundlichem Gruß
Holger
Da ich nur Vermutungen darüber anstellen kann, wie TC eine Dokumentendatei öffnet, kann ich höchsten auf das Beispiel mit ShellExecute verweisen. Es scheint recht zuverlässig unter XP und Vista das zum Dokumenttyp passend Programm zu veranlasst, die Dokumentdatei zu öffnen:
Code: Select all
ShellExecute( NULL, NULL, pszDocumentName, NULL, NULL, SW_SHOWNORMAL )
Es ist also nicht notwendig zu wissen, welches Programm das Dokument öffnet, oder wo dieses Programm im System liegt.
Einzig der Name und das (absolute!)Verzeichnis des Dokumentes reicht in diesem Fall aus.
Wenn eine solche Änderung von Ihnen als zu großes Risiko angesehen wird, dann besteht ja immer noch die Möglichkeit diese Methode nur als Fallback für die momentane Implementierung vorzusehen.
Mit freundlichem Gruß
Holger
Das Thema war ja schon mal da. Das Verhalten ist scheinbar sehr betriebssystemspezifisch:
http://www.ghisler.ch/board/viewtopic.php?p=109677#109677
http://www.ghisler.ch/board/viewtopic.php?p=109677#109677
- ghisler(Author)
- Site Admin
- Posts: 50386
- Joined: 2003-02-04, 09:46 UTC
- Location: Switzerland
- Contact:
OK, ich rufe nun mal probeweise ShellExecuteEx mit Verb=NULL-Pointer auf. Unter Windows 2000 scheint das tatsaechlich zu gehen, auch wenn "open" nicht das Default-Verb ist. Ich bin gespannt, was nun dafür nicht mehr funktioniert...
Author of Total Commander
https://www.ghisler.com
https://www.ghisler.com