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 出错。

请问是怎么回事呢?
...全文
118 2 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
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;
后面的, 不要用 @;

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧