我遇到问题,让HidD_GetSerialNumberString只给我一些设备的序列号。 在某些设备上它工作正常,但在其他设备上,我得到的是“ÿÿÿ”作为序列号。 我怀疑它与Delphi 2009有关,它是unicode,但我根本无法理解它。 有解决方案吗?
编辑(声明):
type
THidD_GetSerialNumberString = function(HidDeviceObject: THandle; Buffer: PWideChar; BufferLength: Integer): LongBool; stdcall;
var
HidD_GetSerialNumberString: THidD_GetSerialNumberString;
//in the LoadHid-function
@HidD_GetSerialNumberString := GetModuleSymbolEx(HidLib, 'HidD_GetSerialNumberString', Result);
用法:
var
test : PWideChar;
...
GetMem(test, 512);
if HidD_GetSerialNumberString(HidFileHandle, Test, 512) then
FSerialNumber := test; //FSerialNumber is WideString
FreeMem(test);
答案 0 :(得分:0)
您的代码在所有版本的Delphi中都很好。虽然很明显它涉及到由Unicode前Delphi编译时的UTF-16到ANSI转换。但是,因为您使用的Delphi 2009不是问题。
Unicode转换没有问题。 HidD_GetSerialNumberString
函数使用以null结尾的UTF-16字符串填充您提供的缓冲区。由于您声明test
正是如此,因此Delphi将生成复制到Delphi string
变量所需的代码。
HidD_GetSerialNumberString
是否可能返回false,因此FSerialNumber
未正确初始化?除此之外,人们可以做出的唯一结论是:
HidD_GetSerialNumberString
在您返回True
时向您撒谎。HidD_GetSerialNumberString
返回的序列号实际上是ÿÿÿ
。