关于结构体赋值的怪问题 ( 积分: 50 )

  • 主题发起人 主题发起人 looyo
  • 开始时间 开始时间
L

looyo

Unregistered / Unconfirmed
GUEST, unregistred user!
record类型定义
type
//////////////add by wanghui begin
pUnShort=^Word;
pCoAuthIdentity=^_CoAuthIdentity;
_CoAuthIdentity=record
user:pUnShort;
UserLength:ULONG;
Domain:pUnShort;
DomainLength:Ulong;
password:pUnShort;
PasswordLength:ulong;
Flags:ulong;
end;
_CoAuthInfo=record
dwAuthnSvc:DWORD;
dwAuthzSvc:DWORD;
pwszServerPrincName:WideString;
dwAuthnLevel:Dword;
dwImpersonationLevel:dword;
pAuthIdentityData:pCoAuthIdentity;
dwCapabilities:DWORD;
end;
赋值函数
function getAuthInfo(var Fcai:_CoAuthInfo):boolean;
var

fcid:_CoAuthIdentity
wUser,wDomain,wPsw:WideString;
begin
wUser:='whuser';//用户名
wDomain:='192.168.1.6';//远程计算机名
wPsw:='Wanghui123';//密码

FillMemory(@Fcai,sizeof(Fcai),0);
FillMemory(@FCid,sizeof(FCid),0);
// FillMemory(@FSvInfo,sizeof(FSvInfo),0);
with fcid do begin
user:=pUnshort(@wUser[1]);
UserLength:=length(wUser);
Domain:=pUnshort(@wDomain[1]);
DomainLength:=length(wDomain);
password:=pUnshort(@wPsw[1]);
PasswordLength:=length(wPsw);
Flags:=2
//SEC_WINNT_AUTH_IDENTITY_UNICODE
end;
//以上填充_CoAuthIdentity结构
with fcai do begin
dwAuthnSvc:=10;//winNt默认的鉴证服务 RPC_C_AUTHN_WINNT
dwAuthzSvc:=$FFFFFF;//0
//RPC_C_AUTHZ_NONE
//pwszServerPrincName:=pwidechar(wDomain);
dwAuthnLevel:=3;//0;
dwImpersonationLevel:=3;//必须设置成模拟
pAuthIdentityData:=@fcid;
dwCapabilities:=$0;//$0800;
end;
result:=true;
end;

如果我在调用函数中直接放置了getAuthInfo 中包含的代码,程序执行正常。
然而如果我用getauthinfo 取得fcai后面的程序就调用不正常了,但是检查了一下fcai的值两种方法是一样的,真的太奇怪了。
我使用fcai的地方是
with fcai do
CoSetProxyBlanket(iu,dwAuthnSvc,dwAuthzSvc,pwidechar(pAuthIdentityData^.Domain),
dwAuthnLevel,dwImpersonationLevel,pAuthIdentityData,dwCapabilities);
 
你代码中 fcai 里面的 pAuthIdentityData 指向了局部变量, 当getAuthInfo 调用
完成后已经没有任何意义了, 如果想用在返回值中, 动态申请或者用全局变量
 
tseug:
但是两种方式赋值后,我检验过各项数据都一样啊。
 
堆栈中的数据没被覆盖前什么事都没有,一旦被破坏, 里面的一切都不确定了
 
两种方法,我都用以下代码输出后察看过,值都是正确的(writelog是我自己定义的输出日志的函数)
writelog('fcai.dwAuthnSvc='+inttostr(fcai.dwAuthnSvc));
writelog('fcai.dwAuthzSvc='+inttostr(fcai.dwAuthzSvc));
writelog('fcai.dwAuthnLevel='+inttostr(fcai.dwAuthnLevel));
writelog('fcai.dwImpersonationLevel='+inttostr(fcai.dwImpersonationLevel));
writelog('fcai.dwCapabilities='+inttostr(fcai.dwCapabilities));
writelog('fcai.pAuthIdentityData^.Domain='+pwidechar(fcai.pAuthIdentityData^.Domain));
writelog('fcai.pAuthIdentityData.UserLength='+inttostr(fcai.pAuthIdentityData.UserLength));
writelog('fcai.pAuthIdentityData.DomainLength='+inttostr(fcai.pAuthIdentityData.DomainLength));
writelog('fcai.pAuthIdentityData.PasswordLength='+inttostr(fcai.pAuthIdentityData.PasswordLength));
writelog('fcai.pAuthIdentityData.Flags='+inttostr(fcai.pAuthIdentityData.Flags));
writelog('fcai.pAuthIdentityData.user='+pwidechar(fcai.pAuthIdentityData^.user));
writelog('fcai.pAuthIdentityData.Domain='+pwidechar(fcai.pAuthIdentityData.Domain));
writelog('fcai.pAuthIdentityData.password='+pwidechar(fcai.pAuthIdentityData.password));

输出的日志为
[2007-07-30 12:57:23] fcai.dwAuthnSvc=10
[2007-07-30 12:57:23] fcai.dwAuthzSvc=16777215
[2007-07-30 12:57:23] fcai.dwAuthnLevel=3
[2007-07-30 12:57:23] fcai.dwImpersonationLevel=3
[2007-07-30 12:57:23] fcai.dwCapabilities=0
[2007-07-30 12:57:23] fcai.pAuthIdentityData^.Domain=10.40.186.169
[2007-07-30 12:57:23] fcai.pAuthIdentityData.UserLength=6
[2007-07-30 12:57:23] fcai.pAuthIdentityData.DomainLength=13
[2007-07-30 12:57:23] fcai.pAuthIdentityData.PasswordLength=10
[2007-07-30 12:57:23] fcai.pAuthIdentityData.Flags=2
[2007-07-30 12:57:23] fcai.pAuthIdentityData.user=whuser
[2007-07-30 12:57:23] fcai.pAuthIdentityData.Domain=10.40.186.169
[2007-07-30 12:57:23] fcai.pAuthIdentityData.password=Wanghui123
 
tseug,
你说的有道理
CoSetProxyBlanket 之后,我在输出日志,果然发现
fcai.pAuthIdentityData.password 和fcai.pAuthIdentityData.user的值对调了,
我不想用全局变量,看有什么好办法吗?
 
用GetMem动态申请内存吧
 
小弟功力浅,
难道用FillMemory 不算是动态分配了内存了吗。
还有如果我用getmem如何给我的记录类型分配内存,请系统写个例子如何?
 
fillMemory只是用指定的值填充内存(常用于初始化),一般用于GetMem后,当然,更多的时候是用ZeroMemory来初始化内存
 
后退
顶部