NetUserEnum API 的封装问题

Spacesoft 2003-12-17 04:57:08
这个API 的原型如下:

NET_API_STATUS NetUserEnum(
LPCWSTR servername,
DWORD level,
DWORD filter,
LPBYTE *bufptr,
DWORD prefmaxlen,
LPDWORD entriesread,
LPDWORD totalentries,
LPDWORD resume_handle
);

我翻译成这样:

TFnNetUserEnum = function(ServerName: PWideChar;
Level: DWORD;
Filter: DWORD;
Bufptr: PByte;
prefmaxlen: DWORD;
entriesread: PDWORD;
totalentries: PDWORD;
resume_handle: PDWORD
): DWORD; stdcall;

然后是这样使用的:
var
fnNetUserEnum: TFnNetUserEnum;
hNetAPI32: THandle;
wszBuff: array[1..256] of WideChar;
nStatus: Integer;
pBuffer: PUSER_INFO_1;
dwPrefMaxLen: DWORD;
dwEntriesRead: DWORD;
dwTotalEntries: DWORD;
dwResumeHandle: DWORD;
begin
hNetAPI32 := LoadLibrary('NETAPI32.DLL');

@fnNetApiBufferFree := GetProcAddress(hNetAPI32, 'NetApiBufferFree');

nStatus := fnNetUserEnum(@wszBuff, 1, FILTER_NORMAL_ACCOUNT,
PByte(pBuffer),
dwPrefMaxLen,
@dwEntriesRead,
@dwTotalEntries,
@dwResumeHandle
);
end;

结果调用到nStatus := fnNetUserEnum(...)这句时一直说我
"Write of address 0000000",是NETAPI32.DLL 出错。

请问是怎么回事呢?
...全文
87 2 打赏 收藏 举报
写回复
2 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
Spacesoft 2003-12-17
哦哦哦,多谢提醒^_^

原来LPBYTE *bufptr是Pointer of Pointer,没注意到,谢谢了^_^
  • 打赏
  • 举报
回复
aiirii 2003-12-17
function NetUserEnum(ServerName: PWideChar;
Level,
Filter: DWord;
var Buffer: Pointer;
PrefMaxLen: DWord;
var EntriesRead,
TotalEntries,
ResumeHandle: DWord): LongWord;stdcall;

@wszBuff 如果是没有赋值, 就用nil;
后面的, 不要用 @;

  • 打赏
  • 举报
回复
相关推荐
发帖
Windows SDK/API
加入

1168

社区成员

Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
申请成为版主
帖子事件
创建了帖子
2003-12-17 04:57
社区公告
暂无公告