最近在做一些项目时,经常出现客户要求我们送手持终端客户现象.这样,我们只有提高设备的销售价格,但有些客户他们需求10台,在采购2台完成测试后,就因为价格(我们将软件价格分摊到设备)比市面上高,而选择其他供应商,对于这样一种情况,让人很恼火,所以在程序中加入设备ID号的绑定,相关代码如下
private
static
Int32 METHOD_BUFFERED
=
0
;
private
static
Int32 FILE_ANY_ACCESS
=
0
;
private
static
Int32 FILE_DEVICE_HAL
=
0x00000101
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
private
const
Int32 ERROR_NOT_SUPPORTED
=
0x32
;
private
const
Int32 ERROR_INSUFFICIENT_BUFFER
=
0x7A
;
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
private
static
Int32 IOCTL_HAL_GET_DEVICEID
=
((FILE_DEVICE_HAL)
<<
16
)
|
((FILE_ANY_ACCESS)
<<
14
)
|
((
21
)
<<
2
)
|
(METHOD_BUFFERED);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
[DllImport(
"
coredll.dll
"
, SetLastError
=
true
)]
private
static
extern
bool
KernelIoControl(Int32 dwIoControlCode,
IntPtr lpInBuf, Int32 nInBufSize,
byte
[] lpOutBuf,
Int32 nOutBufSize,
ref
Int32 lpBytesReturned);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
[DllImport(
"
CoreDll.dll
"
)]
public
static
extern
int
GetSystemMemoryDivision
(
ref
uint
lpdwStorePages,
ref
uint
lpdwRamPages,
ref
uint
lpdwPageSize
);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
[DllImport(
"
coredll.dll
"
)]
public
static
extern
void
GetSystemDirectory(StringBuilder SysDir,
int
count);
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
//
获取设备ID号
public
string
CPUID
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
get ...{ return GetDeviceID().ToString().Trim(); }
}
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
public
string
GetDeviceID()
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
...
{
byte[] outbuff = new byte[20];
Int32 dwOutBytes;
bool done = false;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Int32 nBuffSize = outbuff.Length;
BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0);
dwOutBytes = 0;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
while (!done)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
if (KernelIoControl(IOCTL_HAL_GET_DEVICEID, IntPtr.Zero,
0, outbuff, nBuffSize, ref dwOutBytes))
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
done = true;
}
else
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
int error = Marshal.GetLastWin32Error();
switch (error)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
case ERROR_NOT_SUPPORTED:
throw new NotSupportedException(
"IOCTL_HAL_GET_DEVICEID is not supported on this device",
new Win32Exception(error));
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
case ERROR_INSUFFICIENT_BUFFER:
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
nBuffSize = BitConverter.ToInt32(outbuff, 0);
outbuff = new byte[nBuffSize];
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
BitConverter.GetBytes(nBuffSize).CopyTo(outbuff, 0);
break;
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
default:
throw new Win32Exception(error, "Unexpected error");
}
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
Int32 dwPresetIDOffset = BitConverter.ToInt32(outbuff, 0x4);
Int32 dwPresetIDSize = BitConverter.ToInt32(outbuff, 0x8);
Int32 dwPlatformIDOffset = BitConverter.ToInt32(outbuff, 0xc);
Int32 dwPlatformIDSize = BitConverter.ToInt32(outbuff, 0x10);
StringBuilder sb = new StringBuilder();
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
for (int i = dwPresetIDOffset;
i < dwPresetIDOffset + dwPresetIDSize; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
sb.Append(String.Format("{0:X2}", outbuff[i]));
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
sb.Append("-");
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
for (int i = dwPlatformIDOffset;
i < dwPlatformIDOffset + dwPlatformIDSize; i++)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
...{
sb.Append(String.Format("{0:X2}", outbuff[i]));
}
return sb.ToString();
占华
http://www.cardprinterworld.com