BuildExplicitAccessWithName等函数错误问题???(0分)

  • 主题发起人 主题发起人 cyradg
  • 开始时间 开始时间
C

cyradg

Unregistered / Unconfirmed
GUEST, unregistred user!
EXPLICIT_ACCESS ea;<br>PACL pDacl;<br>ZeroMemory(&amp;ea,sizeof(EXPLICIT_ACCESS));<br>BuildExplicitAccessWithName(&amp;ea,"Administrator",<br> KEY_ALL_ACCESS, &nbsp; &nbsp; // type of access<br>&nbsp; &nbsp; SET_ACCESS, &nbsp; &nbsp; &nbsp;// access mode<br>&nbsp; &nbsp; SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让自健继承他的权限;<br>pDacl=NULL;<br>SetEntriesInAcl(1,&amp;ea,NULL,&amp;pDacl);<br>if (NULL != pDacl) <br>{<br> LocalFree(pDacl);<br> printf("YES");<br>}<br><br>上面是一段VC60的代码,编译执行,控制台窗口会显示“YES”字样,而且没有任何错误报告,下面把它翻译成<br><br>Delphi代码(uses accctrl,aclapi)<br><br>FillChar(ea,Sizeof(ea),0);<br>//设置用户名"Administrator"对指定的键有所有操作权到结构ea<br>BuildExplicitAccessWithName(@ea,'Administrator', &nbsp; // name of trustee<br>&nbsp; &nbsp; KEY_ALL_ACCESS, &nbsp; &nbsp; // type of access<br>&nbsp; &nbsp; SET_ACCESS, &nbsp; &nbsp; &nbsp;// access mode<br>&nbsp; &nbsp; SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让自健继承他的权限;<br>pDacl :=nil;<br>SetEntriesInAcl(1,@ea,nil,pDacl); <br>if pDacl&lt;&gt;nil then LocalFree(DWORD(pDacl)); <br><br>整个过程在调试时时每一句都可以执行正常,只是到代码执行结束时报错,错误类型五花八门,其实执行到BuildExplicitAccessWithName时(把后面代码注释掉)就开始出错了,而且强行执行到SetEntriesInAcl时,pDacl仍然是nil,函数返回87错误(无效的参数,奇怪!),上面的代码从VC60那翻译应该没有错误呀,难道Delphi真的很烂??<br><br>如果有能解决者,请到http://delphibbs.com/delphibbs/dispq.asp?lid=3871445拿分,由于不能被回答问题实在太多,本次问题不给分。<br><br>谢谢!!
 
需要 InitializeAcl ?
 
首先感谢楼上的,其实到BuildExplicitAccessWithName那就开始出错了(报读写错误,而且不是这个函数报的,好象是Delphi自己出问题了),那个SetEntriesInAcl里的pDacl是Windows创建的,不需要我们来InitializeAcl,查一下MSDN就知道,使用SetEntriesInAcl成功以后,pDacl是要用LocalFree来释放pDacl的,并且我提供的正常执行的VC代码里也没有写InitializeAcl,LSUPER兄可以试一下以下代码(Delphi的,要Uses accctrl,aclapi),我的Delphi执行完毕就报错了,而且调试时,你也会发现,语句走到Caption :="执行完毕";一切都是正常的,显然BuildExplicitAccessWithName好象没出问题,但是ea值似乎不正常,执行完Caption :="执行完毕";Delphi就报错了,我只能解释为Delphi执行API函数BuildExplicitAccessWithName似乎有核心上的问题。<br><br>var<br>&nbsp; &nbsp; ea:EXPLICIT_ACCESS ;<br>begin<br>FillChar(ea,Sizeof(ea),0);<br>//设置用户名"Administrator"对指定的键有所有操作权到结构ea<br>BuildExplicitAccessWithName(@ea,'Administrator', &nbsp; // name of trustee<br>&nbsp; &nbsp; KEY_ALL_ACCESS, &nbsp; &nbsp; // type of access<br>&nbsp; &nbsp; SET_ACCESS, &nbsp; &nbsp; &nbsp;// access mode<br>&nbsp; &nbsp; SUB_CONTAINERS_AND_OBJECTS_INHERIT); //让自健继承他的权限;<br>Caption :="执行完毕";<br>end;
 
现在进一步确定Delphi执行BuildExplicitAccessWithName是有问题的,下面的代码又是正常的,没有任何意外错误,也是返回87值,显然BuildExplicitAccessWithName创建ea失败。看了N遍BuildExplicitAccessWithName的申明,对比MSDN的申明,也没看出哪里有问题,难道真是Delphi核心出问题了?<br><br>var<br>&nbsp; &nbsp; ea:EXPLICIT_ACCESS ;<br>begin<br>FillChar(ea,Sizeof(ea),0);<br>Caption :=inttostr(SetEntriesInAcl(1,@ea,nil,pDacl));<br>end;
 
问题已经解决,是Delphi的EXPLICIT_ACCESS结构定义有问题,VC里EXPLICIT_ACCESS结构尺寸是32,而Delphi里是20,主要是两方面:1、accctrl里使用了packed关键字,去掉它,2、结构里的枚举类型VC占4个字节,Delphi里是占1个字节,用{$Z4}强行使Delphi里占4个字节,通过重新修改EXPLICIT_ACCESS结构,问题已经解决,看来Delphi小问题不少。<br>最后还是自己解决的,非常遗憾,没人最终回答。
 
后退
顶部