10
votes

Comment puis-je afficher la boîte de dialogue "Ouvrir avec" pour une extension de fichier non enregistrée?

Je veux laisser l'utilisateur sélectionner une association (ouverte avec) pour une extension de fichier actuellement non enregistrée.

actuellement, je dis actuellement à l'API d'ouvrir le fichier à l'aide de shellexecute et renvoie un code error_no_association code d'erreur.

Y a-t-il un moyen de dire à l'API qu'il devrait laisser l'utilisateur sélectionner une nouvelle association?


1 commentaires

Cela pourrait le faire: rundll32.exe shell32.dll, openas_rundll "c: \ chemin \ text.txt"


3 Réponses :


12
votes

J'utilise xxx

edit (inspiré par David's Commenter et https://stackoverflow.com/a/13229516/1431618 ): On peut omettre shellexecute et rundll32 en appelant openas_rundll directement: xxx

il y a aussi ShopenwithDialog sur Windows Vista et plus tard . (Je trouve intéressant que Microsoft a écrit un point d'entrée compatible Rundll, mais jusqu'à ce que Vista ne prêtait pas la peine de fournir une fonction d'API régulière.)


6 commentaires

Merci, j'ajouterai cela comme la baisse si le premier échoue, car je veux seulement la boîte de dialogue si je ne peux pas déjà l'ouvrir.


La bonne façon d'appeler la boîte de dialogue consiste à utiliser le verbe openas à la place: Shellexecute (Ahandle, 'Openas', Pchar (Afilename), Nil, Nil, Sw_Shownormal);


@Remy: Cela ne fonctionne pas pour moi (Windows 7 64 bits). I Obtenir une erreur système 1155 - Traduit de l'allemand: "Le fichier spécifié n'a pas d'application associée".


@LrichgerHARDT: Openas fonctionne pour moi sur ma machine Win7 64 bits, à la fois pour shellexecute () et shellexecuteeex () .


Serait plus facile d'appeler openas_rundll directement plutôt que d'impliquer un appel à shellexecute .


Notez que openas_rundll est sans papiers et ne fonctionne pas toujours.



3
votes

Allez avec le code suivant, vous obtiendrez votre solution- xxx

See_mask_invokeidlist Cette variable définie "verbe" du registre de système présenté.


0 commentaires

3
votes

N'utilisez simplement pas de verbe explicite. L'utilisation d'un verbe spécifique comme 'ouvert' est une grosse erreur:

  • 'Open' peut ne pas être un verbe par défaut (par exemple, il peut s'agir de "jouer", "éditer" ou "exécuter") li>
  • 'ouvert' peut ne pas exister li> ul>

    C'est un moyen plus correct pour simplement passer nil comme verbe fort>. Le système sélectionnera automatiquement le verbe le plus approprié: p>

    • Le verbe par défaut sera utilisé, s'il est défini li>
    • verbe 'OUVERT' sera utilisé, si aucun verbe par défaut n'est défini LI>
    • Le premier verbe sera utilisé, si aucun verbe par défaut et «ouvert» est disponible sur LI>
    • si aucun verbe n'est attribué - le système apportera "Ouvrir avec" la boîte de dialogue forte> li> ul>

      En d'autres termes, SIMPLE P>

      ShellExecute(0, nil, 'C:\MyFile.StrangeExt', ...);
      


0 commentaires