-2

我无法让 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);
4

1 回答 1

0

您的代码在所有版本的 Delphi 中都很好。虽然很明显,当由预 Unicode Delphi 编译时,它涉及 UTF-16 到 ANSI 的转换。但是,由于您使用的是 Delphi 2009,所以这不是问题。

Unicode 转换没有问题。该HidD_GetSerialNumberString函数使用以空字符结尾的 UTF-16 字符串填充您提供的缓冲区。并且由于您声明test是这样,Delphi 将生成复制到 Delphistring变量所需的代码。

是否有可能HidD_GetSerialNumberString返回 false 并且FSerialNumber没有正确初始化?除此之外,唯一可以得出的结论是:

  • HidD_GetSerialNumberString它回来时是在骗你True
  • 调用返回的序列号HidD_GetSerialNumberString真的是ÿÿÿ
于 2013-06-17T10:58:50.147 回答