我試圖調用Windows API函數EnumerateTraceGuids:EnumerateTraceGuids返回 「參數不正確」(87)
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);
我轉換的代碼到德爾福:
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
下列之一爲真:
- PropertyArrayCount爲零
- GuidProper tiesArray是NULL
第一種情況是真實的,我的第二個參數PropertyArrayCount
爲零 - 就像樣品說它應該是。
呃,這真是MSDN頁面上的一些*可怕*示例代碼。但是用C編寫的修剪下來的代碼實際上可以工作,按照預期返回'ERROR_MORE_DATA'。不幸的是,我不知道德爾福,所以我不能告訴你如何修復這些代碼,但我很確定這個錯誤在翻譯過程中會出現。 – 2012-02-14 05:16:19
@Cody有趣的是MSDN代碼只是偶然的工作。如果對malloc的調用返回初始化爲零的內存,那麼該代碼將失敗!所以你對代碼的感覺是點亮的。 – 2012-02-14 09:01:53