IE保護模式下,ActiveX控件會打不開別的進程創建的共享內存,原因是IE運行在低完整性級別權限下,一般應用程序運行在中完整性級別。別的應用程序創建的共享內存,即使賦予Everyone權限,ActiveX控件仍然會打不開。
解決方案:創建共享內存的時候,設置下完整性級別:
bool SetLowLabelToKernelObject(LPCTSTR lpszObjectName) { // See http://msdn.microsoft.com/en-us/library/bb625960.aspx
// The LABEL_SECURITY_INFORMATION SDDL SACL to be set for low integrity LPCTSTR LOW_INTEGRITY_SDDL_SACL = _T("S:(ML;;NW;;;LW)"); PSECURITY_DESCRIPTOR pSD = NULL;
if (!ConvertStringSecurityDescriptorToSecurityDescriptor(LOW_INTEGRITY_SDDL_SACL, SDDL_REVISION_1, &pSD, NULL)) { return false; }
LOKI_ON_BLOCK_EXIT(LocalFree, pSD);
PACL pSacl = NULL; BOOL fSaclPresent = FALSE; BOOL fSaclDefaulted = FALSE;
if (!GetSecurityDescriptorSacl(pSD, &fSaclPresent, &pSacl, &fSaclDefaulted)) { return false; }
// Note that psidOwner, psidGroup, and pDacl are all NULL and set the new LABEL_SECURITY_INFORMATION DWORD dwError = SetNamedSecurityInfoW((LPTSTR)lpszObjectName, SE_KERNEL_OBJECT, LABEL_SECURITY_INFORMATION, NULL, NULL, NULL, pSacl);
return dwError == ERROR_SUCCESS; } |
參考資料:
http://www.microsoft.com/china/msdn/library/webservices/WebApp/ProtectedMode.mspx?mfr=true
http://www.cnblogs.com/jcss2008/archive/2009/06/06/1497528.html