2010-10-21 4 views
1

J'ai un lecteur de carte USB développé sur mesure. J'utilise le code suivant pour interagir et iterrate sur le dispositif:Eject Carte mémoire du lecteur de carte C#

http://www.codeproject.com/KB/system/usbeject.aspx

Le code ci-dessus fournit une méthode « d'éjection » en utilisant la ligne suivante:

Native.CM_Request_Device_Eject_NoUi(device.InstanceHandle, IntPtr.Zero, null, 0, 0); 

Cependant, cette méthode « d'éjection » démonte le lecteur entier au lieu d'éjecter simplement la carte multimédia.

Pourquoi est-ce un problème parce que je veux «éjecter» la carte multimédia, puis en mettre un autre. Cependant, lorsque le lecteur entier est éjecté, je dois débrancher/rebrancher l'appareil pour qu'il apparaisse.

Dans Windows Explorer lorsque je fais un clic droit sur 'éjecter' il fonctionne comme j'imagine, où il supprime en toute sécurité la carte mémoire, mais pas le lecteur de carte.

Comment puis-je implémenter ce type différent d'éjection dans C#?

Merci, Stephanie

+0

Ça ne devrait pas être "Aweso"? – MusiGenesis

+0

... ou c'est comme dans "c'est" plutôt que d'en faire partie, et "Génial"? –

+0

C'est Aweso :) mais des noms trop longs pour la page principale. il faut cliquer dessus pour voir le profil complet :) –

Répondre

1

Je suis venu ici par hasard tout en faisant une recherche sur « CM_Request_Device_Eject_NoUi », et a vu qu'il était semblable à une solution je fait récemment en tirant morceaux similaires d'une solution. Pardonnez les réponses tardives.

est ici ce qui a fonctionné pour moi (ce qui aborde également certaines questions que j'ai vu sur d'autres SO questions concernant AutoEjectVolume de l'échantillon Microsoft ne « faire tout » que le système ne lorsque vous retirez périphérique en toute sécurité en utilisant le système d'exploitation):

  1. Commencez par les étapes décrites dans How to Eject Removable Media in Windows.
  2. Remplacez l'appel par AutoEjectVolume par le code qui est en fait le corps de la méthode RemoveDrive de How to Prepare a USB Drive for Safe Removal. Notez que ce dernier travail repose fortement sur deux autres articles de CodeProject —, y compris celui que vous avez référencé dans votre question — porté sur C#.

Dans 2, je dis « en vigueur » parce — dans la pratique — vous utilisez le même hVolume dans les deux solutions, et il est plus logique de faire tous les contrôles dans la méthode CodeProject RemoveDriveavant appeler LockVolume, DismountVolume ou PrepareRemovalOfVolume dans la solution Microsoft et puis appelez CM_Request_Device_Eject_NoUi comme indiqué dans la solution CodeProject.

Un bref résumé pseudo-code:

  • Ouvrir le volume avec CreateFile (CodeProject)
  • Obtenir instance de dispositif de commande de la poignée et le dispositif de parent de disque poignée d'instance (CodeProject)
  • sortie avant d'appeler — en particulier — DismountVolume, si l'une des étapes ci-dessus échoue (CodeProject)
  • Call LockVolume, DismountVolume et PrepareRemovalOfVolume utilisant le hVolume retourné de CreateFile (Microsoft)
  • Vous pouvez fermer la hVolume à tout moment après cette
  • Appel CM_Request_Device_Eject_NoUi sur l'appareil
    handle d'instance de parent du lecteur (CodeProject)