【问题标题】:Problems with Delphi 2009 + HidD_GetSerialNumberStringDelphi 2009 + HidD_GetSerialNumberString 的问题
【发布时间】:2013-06-17 10:29:35
【问题描述】:

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

【问题讨论】:

  • 请显示代码,特别是声明,并致电HidD_GetSerialNumberString
  • 我使用的是JVCL的jvHidControllerClass.pas和Hid.pas
  • 很好。请出示我要求的代码。
  • 什么是 GetModuleSymbleEx?
  • 在调用 api 之前您是否尝试过将缓冲区归零?

标签: delphi delphi-2009 hid


【解决方案1】:

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

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

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

  • HidD_GetSerialNumberString 返回 True 时是在骗你。
  • 调用HidD_GetSerialNumberString返回的序列号确实是ÿÿÿ

【讨论】:

  • 我不明白那个评论。你的意思是我最后一句话的答案是否定的?你的意思是HidD_GetSerialNumberString 总是返回True 还是FSerialNumber 总是被初始化。
  • 哦,是的,我的意思是我的代码实际上是在检查真/假结果,但我在这里简化了代码以使其更易于阅读。
  • 无论如何,如果您对HidD_GetSerialNumberString 的调用返回True,那么设备的序列号确实是您的代码所说的,至少根据HidD_GetSerialNumberString。也就是说,如果有错误,不在问题的代码中
  • 这就是我所害怕的。感谢您的帮助。
  • 您在这方面需要更多帮助吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 1970-01-01
  • 2011-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多