2010-02-24 19 views
2

J'ai un projet dans lequel je devrais copier des fichiers trouvés dans un PDA (dans mon cas, c'est un MC3000 si cela fait une différence). J'ai ActiveSync installé et il crée le dossier de synchronisation pour moi très bien. Cependant, je voudrais pouvoir lire le contenu du PDA non seulement dans son dossier MyDocument de sorte que je ne peux pas l'employer (plus il doit fonctionner avec plus de 20 PDA possibles du même modèle, faisant ainsi le répertoire 20+)Lire le contenu d'un répertoire PDA pendant la synchronisation avec ActiveSync

Y a-t-il un moyen de faire des E/S à l'intérieur du PDA, alors qu'il est ancré et synchronisé avec ActiveSync.

Je peux voir le «périphérique mobile» dans l'explorateur.

Merci

Répondre

3

Utilisez RAPI. C'est un projet codeplex qui fournit des classes wrapper managées pour Rapi.dll et ActiveSync. Il permet aux applications .NET de bureau de communiquer avec des appareils mobiles connectés. L'emballage provient du OpenNetCF project, mais est maintenant géré séparément.

Vous pouvez utiliser la DLL du projet RAPI entière à partir de ce projet ou simplement utiliser le sous-ensemble de code dont vous avez besoin. J'avais besoin de créer des fichiers sur l'appareil quand il se connectait, donc je n'avais pas besoin des trucs de statistiques de performance, ni des éléments de registre de périphériques inclus dans Rapi. Je viens donc de 3 fichiers a saisi les sources dont je avais besoin ...

La façon dont cela fonctionne pour moi, est la suivante:

  • Utilisez ActiveSync (DccManSink) pour détecter la connexion appareil mobile/déconnecter l'état
  • Utilisation l'encapsuleur RAPI pour copier des fichiers sur l'appareil, créer des fichiers sur l'appareil, copier des fichiers à partir de l'appareil, etc.

private DccMan DeviceConnectionMgr; 
private int AdviceCode; 
private int ConnectionStatus = 1; 
private System.Threading.AutoResetEvent DeviceConnectionNotification = new System.Threading.AutoResetEvent(false); 


public void OnConnectionError() 
{ 
    ConnectionStatus = -1; 
    DeviceConnectionNotification.Set(); 
} 

public void OnIpAssigned(int address) 
{ 
    ConnectionStatus = 0; 
    DeviceConnectionNotification.Set(); 
} 


private void btnCopyToDevice_Click(object sender, EventArgs e) 
{ 
    // copy the database (in the form of an XML file) to the connected device 
    Cursor.Current = Cursors.WaitCursor; 

    // register for events and wait. 
    this.DeviceConnectionMgr = new DccMan(); 

    DccManSink deviceEvents = new DccManSink(); 
    deviceEvents.IPChange += new IPAddrHandler(this.OnIpAssigned); 
    deviceEvents.Error += new ErrorHandler(this.OnConnectionError); 
    ((IDccMan)DeviceConnectionMgr).Advise(deviceEvents, out this.AdviceCode); 

    // should do this asynchronously, with a timeout; too lazy. 
    this.statusLabel.Text = "Waiting for a Windows Mobile device to connect...."; 

    this.Update(); 
    Application.DoEvents(); // allow the form to update 

    bool exitSynchContextBeforeWait = false; 
    DeviceConnectionNotification.WaitOne(SECONDS_TO_WAIT_FOR_DEVICE * 1000, exitSynchContextBeforeWait); 

    if (ConnectionStatus == 0) 
    { 
     this.statusLabel.Text = "The Device is now connected."; 
     this.Update(); 
     Application.DoEvents(); // allow the form to update 

     RAPI deviceConnection = new RAPI(); 
     deviceConnection.Connect(true, 120); // wait up to 2 minutes until connected 
     if (deviceConnection.Connected) 
     { 
      this.statusLabel.Text = "Copying the database file to the connected Windows Mobile device."; 
      this.Update(); 
      Application.DoEvents(); // allow the form to update 
      string destPath = "\\Storage Card\\Application Data\\MyApp\\db.xml"; 
      deviceConnection.CopyFileToDevice(sourceFile, 
               destPath, 
               true); 

      this.statusLabel.Text = "Successfully copied the file to the Windows Mobile device...."; 
     } 
     else 
     { 
      this.statusLabel.Text = "Oh, wait, it seems the Windows Mobile device isn't really connected? Sorry."; 
     } 

    } 
    else 
    { 
     this.statusLabel.Text = "Could not copy the file because the Device does not seem to be connected."; 
    } 

    Cursor.Current = Cursors.Default; 

} 
+0

Ressemble exactement ce que j'ai besoin! Cependant, je ne peux pas le tester pour le moment. Comme j'ai seulement besoin d'obtenir des fichiers du PDA, qui se trouvent dans un répertoire spécifique et constant, cela semble fonctionner. –

+0

J'ai des problèmes à faire ce travail. Quel genre de projet utilisez-vous? Tout ce qui n'est pas dans le code que je devrais savoir ...? Je ne peux surtout rien faire de type DCCMan ou AdviceCode. Merci. –

+0

Whadaya veut dire? "faites n'importe quoi de type ...". Vous aurez besoin du code du projet RAPI sur codeplex.com. Vous avez ça, non? Les classes comme DccManSink et RAPI sont définies dans ce code. AdviceCode est juste un int. (oui, je l'ai omis par erreur lors de l'extraction de ce code d'un projet en cours) – Cheeso