
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)所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)