delphi – EnumerateTraceGuids返回“参数不正确”(87)

delphi – EnumerateTraceGuids返回“参数不正确”(87),第1张

概述我试图调用 Windows API函数 EnumerateTraceGuids: ULONG EnumerateTraceGuids( __inout PTRACE_GUID_PROPERTIES *GuidPropertiesArray, __in ULONG PropertyArrayCount, __out PULONG GuidCount); 从代码示例on 我试图调用 Windows API函数 EnumerateTraceGuids:

ulONG EnumerateTraceGuIDs(  __inout  PTRACE_GUID_PROPERTIES *GuIDPropertIEsArray,__in     ulONG PropertyArrayCount,__out    PulONG GuIDCount);

从代码示例on MSDN开始:

ulONG status = ERROR_SUCCESS;PTRACE_GUID_PROPERTIES *pProvIDers = NulL;ulONG RegisteredProvIDerCount = 0;ulONG ProvIDerCount = 0;pProvIDers = (PTRACE_GUID_PROPERTIES *) malloc(sizeof(PTRACE_GUID_PROPERTIES));status = EnumerateTraceGuIDs(pProvIDers,ProvIDerCount,&RegisteredProvIDerCount);

我将代码转换为Delphi:

var    provIDers: PPointerList;    provIDerCount: LongWord;    registeredProvIDerCount: LongWord;    res: LongWord;begin    provIDerCount := 0;    registeredProvIDerCount := 0;    provIDers := Allocmem(SizeOf(Pointer));    ZeroMemory(provIDers,SizeOf(Pointer));    res := EnumerateTraceGuIDs(provIDers,provIDerCount,{out}registeredProvIDerCount);end;

随着API电话:

function EnumerateTraceGuIDs(      GuIDPropertIEsArray: Pointer;       PropertyArrayCount: Cardinal;       var GuIDCount: Cardinal): Cardinal; stdcall; external 'advAPI32.dll';

我得到结果代码ERROR_INVALID_ParaMETER(87,参数不正确).

我究竟做错了什么?

MSDN描述了导致ERROR_INVALID_ParaMETER的原因:

ERROR_INVALID_ParaMETER

One of the following is true:

PropertyArrayCount is zero GuIDPropertIEsArray is NulL

第一种情况是正确的,我的第二个参数PropertyArrayCount为零 – 就像样本所说的那样.

解决方法 据我所知,您的代码应该与MSDN示例相同.但是,正如Code所说,MSDN示例确实看起来有点时髦.实际上,在我看来,MSDN样本只是偶然的.

请注意,该代码中的注释表明:

// EnumerateTraceGuIDs requires a valID pointer. Create a dummy// allocation,so that you can get the actual allocation size.

然后它在pProvIDers中分配空间来存储单个指针.但是,pProvIDers中包含的值实际上很重要.它不能为NulL.在你的Delphi代码中,你实际上将内存归零了两次.一次使用Allocmem,一次使用ZeroMemory.如果您只是更改Delphi代码以使提供程序的内容非零,那么Delphi代码将开始工作.

这是一个非常简单的项目,它准确地说明了发生了什么:

program _EnumerateTraceGuIDsFaultDemo;{$APPTYPE CONSolE}function EnumerateTraceGuIDs(      GuIDPropertIEsArray: Pointer;      PropertyArrayCount: Cardinal;      var GuIDCount: Cardinal): Cardinal; stdcall; external 'advAPI32.dll';var  provIDers: Pointer;  provIDerCount: LongWord;  registeredProvIDerCount: LongWord;  res: LongWord;begin  provIDerCount := 0;  registeredProvIDerCount := 0;  provIDers := Allocmem(SizeOf(Pointer));//zeroises memory  res := EnumerateTraceGuIDs(provIDers,registeredProvIDerCount);  Writeln(res);//outputs 87  PInteger(provIDers)^ := 1;  res := EnumerateTraceGuIDs(provIDers,registeredProvIDerCount);  Writeln(res);//outputs 234  Readln;end.

所以我认为这解释了这个问题,但我实际上解决的问题还不止于此.我将继续进行下一步的工作,并使用与TRACE_GUID_PROPERTIES结构等效的真实Delphi完全声明EnumerateTraceGuIDs.

我可能会写这样的代码:

program _EnumerateTraceGuIDs;{$APPTYPE CONSolE}{$R *.res}uses  System.SysUtils,windows;type  PTraceGuIDPropertIEs = ^TTraceGuIDPropertIEs;  TTraceGuIDPropertIEs = record    GuID: TGUID;    GuIDType: ulONG;    LoggerID: ulONG;    EnableLevel: ulONG;    EnableFlags: ulONG;    IsEnable: Boolean;  end;function EnumerateTraceGuIDs(  var GuIDPropertIEsArray: PTraceGuIDPropertIEs;  PropertyArrayCount: ulONG;  var GuIDCount: ulONG): ulONG; stdcall; external 'advAPI32.dll';function GetRegisteredProvIDerCount: ulONG;var  provIDer: TTraceGuIDPropertIEs;  pprovIDer: PTraceGuIDPropertIEs;  provIDerCount: LongWord;  registeredProvIDerCount: ulONG;  res: ulONG;begin  provIDerCount := 0;  pprovIDer := @provIDer;  res := EnumerateTraceGuIDs(pprovIDer,registeredProvIDerCount);  if (res<>ERROR_MORE_DATA) and (res<>ERROR_SUCCESS) then    RaiseLastOSError;  Result := registeredProvIDerCount;end;var  i: Integer;  provIDer: TTraceGuIDPropertIEs;  pprovIDer: PTraceGuIDPropertIEs;  provIDers: array of TTraceGuIDPropertIEs;  pprovIDers: array of PTraceGuIDPropertIEs;  provIDerCount: ulONG;  registeredProvIDerCount: ulONG;  res: ulONG;begin  provIDerCount := GetRegisteredProvIDerCount;  SetLength(provIDers,provIDerCount);  SetLength(pprovIDers,provIDerCount);  for i := 0 to provIDerCount-1 do    pprovIDers[i] := @provIDers[i];  res := EnumerateTraceGuIDs(pprovIDers[0],registeredProvIDerCount);  if res<>ERROR_SUCCESS then    RaiseLastOSError;  //do stuff with provIDersend.

我没有尝试在GetRegisteredProvIDerCount中过于可爱,而是传递了指向真实TRACE_GUID_PROPERTIES的指针.

总结

以上是内存溢出为你收集整理的delphi – EnumerateTraceGuids返回“参数不正确”(87)全部内容,希望文章能够帮你解决delphi – EnumerateTraceGuids返回“参数不正确”(87)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/langs/1237450.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-06-06
下一篇2022-06-06

发表评论

登录后才能评论

评论列表(0条)

    保存