Как использовать RAPI.Invoke для вызова метода устройства winapi из приложения Desktop

Мне нужно получить Device Id из настольного приложения, где Device - это портативный терминал на базе Windows CE 5.0 и он подключен к ПК.

Получить эту информацию из приложения на устройстве легко, я могу использовать любой из методов GetDeviceUniqueID или KernelIoControl WinApi, например:

    [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;
    }

Но мне нужно получить это из настольного приложения.

В Windows Mobile 5.X SDK есть образец для получения этого идентификатора из приложения Desktop. Так как я использую Windows CE, этот образец не дает идентификатор (это для Windows Mobile).

getDeviceIdSampleOutput

Я считаю, что можно использовать указанный метод из настольного приложения с помощью метода RAPI.Invoke() (или Opennetcf RAPI). Но я не могу понять, как использовать RAPI.Invoke с многопараметрическим методом WinApi, например, GetDeviceUniqueID.

У меня есть пример кода, также включены подписи C# метода WinApi в качестве комментария:

    //[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
    }

Также здесь есть похожий вопрос, но он не дает никакого решения.

1 ответ

Решение

Я нашел ответ здесь. В двух словах; Прямого пути нет, мне нужно создать Win32 dll с C, где будет сделан вызов WINAPI и развернуть его в папке \Windows. После этого я могу использовать его с RAPI.Invoke(),

Также это ссылка на статью, содержащую реализацию.

Другие вопросы по тегам