0

我需要从桌面应用程序中获取设备 ID,其中设备是基于 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
    }

这里也有一个类似的问题,但没有提供任何解决方案。

4

1 回答 1

1

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

这也是包含实现的文章的链接

于 2015-08-06T06:28:26.257 回答