如何使用RAPI.Invoke从桌面应用程序调用设备winapi方法

时间:2015-08-05 11:49:50

标签: c# winapi windows-mobile windows-ce rapi

我需要从桌面应用程序获取Device Id,其中Device是基于Windows CE 5.0的手持终端,并且它已连接到PC。

从设备中的应用程序获取此信息很简单,我可以使用任何GetDeviceUniqueIDKernelIoControl 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中有一个示例可以从桌面应用中获取此ID。由于我使用的是Windows CE,因此示例没有提供ID(它适用于Windows Mobile)。

getDeviceIdSampleOutput

我相信可能使用RAPI.Invoke()方法(或Opennetcf RAPI)从桌面应用程序中使用所述方法。但我无法想象如何使用RAPI.Invoke与多参数WinApi方法,例如GetDeviceUniqueID。

我有一个示例代码,还包括WinApi方法的C#签名作为注释:

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

同样存在类似的问题here,但没有提供任何解决方案。

1 个答案:

答案 0 :(得分:1)

我找到了答案here。简而言之;没有直接的方法,我需要创建一个带有C的Win32 DLL,其中将调用WINAPI并将其部署到\ Windows文件夹。之后,我可以将其与RAPI.Invoke()一起使用。

此外,this是指向包含实施的文章的链接。