我需要从桌面应用程序获取Device Id,其中Device是基于Windows CE 5.0的手持终端,并且它已连接到PC。
从设备中的应用程序获取此信息很简单,我可以使用任何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中有一个示例可以从桌面应用中获取此ID。由于我使用的是Windows CE,因此示例没有提供ID(它适用于Windows Mobile)。
我相信可能使用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,但没有提供任何解决方案。