2015-08-05 3 views
0

Je dois obtenir l'ID du périphérique à partir d'une application de bureau, où Périphérique est un terminal portable Windows CE 5.0 et est connecté au PC.Comment utiliser RAPI.Invoke pour appeler la méthode winapi du périphérique à partir de l'application Bureau

Obtenir ces informations à partir d'une application au sein de l'appareil est facile, je peux utiliser l'une des GetDeviceUniqueID ou KernelIoControl méthodes de winapi par exemple:

[DllImport("coredll.dll")] 
    private extern static int GetDeviceUniqueID([In, Out] byte[] appdata, 
          int cbApplictionData, 
          int dwDeviceIDVersion, 
          [In, Out] byte[] deviceIDOuput, 
          out uint pcbDeviceIDOutput); 

    public byte[] GetDeviceID(string AppString) 
    { 
     // Call the GetDeviceUniqueID 
     byte[] AppData = Encoding.Unicode.GetBytes(AppString); 
     int appDataSize = AppData.Length; 
     byte[] DeviceOutput = new byte[20]; 
     uint SizeOut = 20; 
     GetDeviceUniqueID(AppData, appDataSize, 1, DeviceOutput, out SizeOut); 
     return DeviceOutput; 
    } 

Mais je dois obtenir ce à partir de l'application de bureau.

Il existe un exemple dans Windows Mobile 5.X SDK pour obtenir cet ID à partir de l'application Desktop. Depuis que j'utilise Windows CE cet exemple ne donne pas d'identifiant (c'est pour Windows Mobile).

getDeviceIdSampleOutput

je crois qu'il est possible utiliser ledit procédé d'application de bureau en utilisant la méthode RAPI.Invoke() (ou OpenNETCF RAPI). Mais je ne peux pas comprendre comment utiliser RAPI.Invoke avec la méthode WinApi multi-paramètres, par ex. GetDeviceUniqueID.

J'ai un exemple de code, inclus également la signature C# de la méthode winapi comme commentaire:

//[DllImport("coredll.dll")] 
    //private extern static int GetDeviceUniqueID([In, Out] byte[] appdata, 
    //      int cbApplictionData, 
    //      int dwDeviceIDVersion, 
    //      [In, Out] byte[] deviceIDOuput, 
    //      out uint pcbDeviceIDOutput); 

    private void buttonGetDeviceID_Click(object sender, RoutedEventArgs e) 
    { 
     // RAPI 
     RAPI rapi = new RAPI(); 
     rapi.Connect(true); 
     // How do I pass several parameters inside a byte[] ? 
     rapi.Invoke(@"\Windows\coredll.dll", "GetDeviceUniqueID", inputData, out outputData); 
     //Process outputData 
    } 

Il y a aussi une question similaire here mais ne fournit pas de solution.

Répondre

1

J'ai trouvé la réponse here. En un mot; Il n'y a pas de moyen direct, j'ai besoin de créer une DLL Win32 avec C où l'appel à WINAPI sera fait et déployer dans le dossier \ Windows. Après cela, je peux l'utiliser avec RAPI.Invoke().

Egalement this est le lien vers l'article contenant l'implémentation.