向大家求救!dll接口转换问题(ACL的权限控制) (100分)

  • 主题发起人 主题发起人 tank37
  • 开始时间 开始时间
T

tank37

Unregistered / Unconfirmed
GUEST, unregistred user!
我在解决了ACL的权限控制问题的时候发现一个问题不知道改怎么办,希望大家多多讨论<br>在api的原型中枚举enum中的元素是4字节的,在Delphi中的枚举型的元素是一个字节的,不知道要如何处理。<br>关于SetEntriesInAcl原型<br>DWORD SetEntriesInAcl(<br>&nbsp; ULONG cCountOfExplicitEntries,<br>&nbsp; PEXPLICIT_ACCESS pListOfExplicitEntries,<br>&nbsp; PACL OldAcl,<br>&nbsp; PACL* NewAcl<br>);<br><br>typedef struct _EXPLICIT_ACCESS { &nbsp;<br>&nbsp; DWORD grfAccessPermissions;<br>&nbsp; ACCESS_MODE grfAccessMode;<br>&nbsp; DWORD grfInheritance;<br>&nbsp; TRUSTEE Trustee;<br>} EXPLICIT_ACCESS, *PEXPLICIT_ACCESS;<br><br>typedef enum _ACCESS_MODE<br>{<br>&nbsp; NOT_USED_ACCESS = 0, -------- 4 byte<br>&nbsp; GRANT_ACCESS, <br>&nbsp; SET_ACCESS, <br>&nbsp; DENY_ACCESS, <br>&nbsp; REVOKE_ACCESS, <br>&nbsp; SET_AUDIT_SUCCESS, <br>&nbsp; SET_AUDIT_FAILURE<br>} ACCESS_MODE;<br><br>原问题(已经解决,ACL的权限控制)<br>我把问题简单话的说明一下就是关于这个API的使用<br>SetEntriesInAcl<br>请大家快点帮忙看一下,在权限ACL真的搞不定了<br>用下面的方法调用后始终放回码始终是87<br>在winerror.h中87代表参数错误.<br>如果正确调用应当返回0,ERROR_SUCCESS<br><br>以下使用C++实现的,调试通过!!!可是用换成Delphi来写就是不对,请大家帮忙查<br>一下原因<br>#include &lt;Aclapi.h&gt;<br> PACL pNewDACL = NULL;<br> EXPLICIT_ACCESS ea;<br> ZeroMemory(&amp;ea, sizeof(EXPLICIT_ACCESS));<br> ea.grfAccessPermissions = GENERIC_ALL;<br> ea.grfAccessMode = SET_ACCESS ;<br> ea.grfInheritance= OBJECT_INHERIT_ACE | CONTAINER_INHERIT_ACE;<br> ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;<br> ea.Trustee.TrusteeType=TRUSTEE_IS_USER;<br> ea.Trustee.ptstrName = "userACL";<br> printf("%i, %i, %i/n", SetEntriesInAclA(1, &amp;ea, NULL, &amp;pNewDACL), OBJECT_INHERIT_ACE, CONTAINER_INHERIT_ACE);<br> SetNamedSecurityInfoA("d://v//v",SE_FILE_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDACL,NULL);<br> LocalFree((HLOCAL) pNewDACL); <br><br> printf("acl modifyed!/n");<br><br>以下是Delphi写的,就是SetEntriesInAcl返回值不对,测试通不过。<br>use AccCtrl, ACLApi;<br><br>procedure TForm1.Button2Click(Sender: TObject);<br>const<br>&nbsp; OBJECT_INHERIT_ACE = $1;<br>&nbsp; CONTAINER_INHERIT_ACE = $2;<br>var<br>&nbsp; pNewDACL: PACL;<br>&nbsp; ea: EXPLICIT_ACCESS;<br>begin<br>&nbsp; //CreateDirectory('d:/v/v', nil);<br>&nbsp; pNewDACL := nil;<br>&nbsp; ZeroMemory(@ea, SizeOf(EXPLICIT_ACCESS));<br>&nbsp; ea.grfAccessPermissions := GENERIC_ALL;<br>&nbsp; ea.grfAccessMode := SET_ACCESS;<br>&nbsp; ea.grfInheritance := OBJECT_INHERIT_ACE or CONTAINER_INHERIT_ACE;<br>&nbsp; ea.Trustee.TrusteeForm := TRUSTEE_IS_NAME;<br>&nbsp; ea.Trustee.TrusteeType := TRUSTEE_IS_USER;<br>&nbsp; ea.Trustee.ptstrName := 'userACL';<br>&nbsp; ShowMessage(IntToStr(SetEntriesInAcl(1, @ea, nil, pNewDACL)));<br>&nbsp; //SetNamedSecurityInfoA('d:/v/v',SE_FILE_OBJECT, DACL_SECURITY_INFORMATION, nil, nil, pNewDACL, nil);<br>&nbsp; ShowMessage('er-er-okey!');<br>End;
 
此问题已经解决但我仍然需要求教各位一些不明白的地方。<br>追查原因SetEntriesInAcl返回的错误码是87,既参数错误。<br>在C++和Delphi下用sizeof分别查看EXPLICIT_ACCESS类型的大小,分别是32和20<br>进一步发现,该函数内使用packed修饰,Delphi下枚举型的大小都是1byte,<br>而C++下都是4byte。<br>所以产生参数错误,然后我将所有的枚举类型转变成DWORD型,调用成功。<br>不知道大家还有什么好一点的 办法
 
为什么现在都没有人愿意回答问题了:([:(]
 
好像SetEntriesInAcl(0, @ea, nil, pNewDACL)就可以通過
 
后退
顶部