CoInitializeSecurity

博客讨论了在多线程环境中遇到的CoInitializeSecurity函数返回值异常问题。作者指出,该函数在某些电脑上成功,而在其他电脑上失败,导致无法获得管理员权限。通过代码调试,发现可能原因是多线程时序问题。解决方案是检查函数调用的顺序和返回值,确保在多线程环境下正确处理。文章还提供了错误代码的解释和示例代码片段。
摘要由CSDN通过智能技术生成

问题是这样:同样的应用程序,在有的电脑上用管理员权限可以运行,有的电脑上用了管理员还是提示没有使用管理员权限,通过代码跟踪,发现是调用CoInitializeSecurity函数时,有的电脑成功,有的电脑失败。在网上找到了下面这篇文章,解决了这一问题。

 

CoInitializeSecurity 学习(转)

2012年01月31日 ⁄ 综合 ⁄ 共 2025字 ⁄ 字号 小 中 大 ⁄ 评论关闭
 
偶今天遇到在多线程中调用CoInitializeSecurity 出现非常奇怪的返回值不争确的问题,看了一个前辈的解决方法,如下:
对于编程,我发现自己还很菜,还有很多东西要学习。今天又从我们公司那位牛人那里学了一课,什么叫程序员。有句话说的好:“如果你用了所有的智慧来写代码,那么你就没有足够的能力来调试程序”。这句话对于我们这些比较菜的程序员来说,有点伤感,不过的确是一个事实。作为一个程序员,不仅仅只是能完成功能,而是要很好的完成,更重要的是当功能出现问题时,你要能很好的找到原因并解决它。
下面是今天发生在我身上的一件事情,对于COM的使用我们都很熟悉,最基本的要求是CoInitialize(), CoUninitialize()。而对于CoInitializeSecurity()这个函数可能不是很熟悉,而我今天要讲的也正是这个函数,今天也在它身上花了大半天的时间。下面是这个函数在MSDN中的定义:

Registers security and sets the default security values for the process. This function is called exactly once per process, either explicitly or implicitly. It can be called by the client, server, or both. For legacy applications and other applications that do not explicitly call CoInitializeSecurity, COM calls this function implicitly with values from the registry. If you set processwide security using the registry and then call CoInitializeSecurity, the AppID registry values will be ignored and the CoInitializeSecurity values will be used.
注册并设置进程的默认的安全值。该函数只被每个进程确切的调用一次,以显式或隐式的方式。它可以被客户端,服务器端或是两边都调用。对于非COM的应用程序不应该显式的被调用,但是对于COM应用程序该函数会隐式的从注册表读取参数来调用。如果你使用注册表设置进程级的安全然后调用CoInitializeSecurity, 那么AppID的注册表值会被忽略而使用CoInitializeSecurity值。从这段话中,我们可以知道两个信息,一,CoInitializeSecurity函数用于设置进程安全;二,只能被进程调用一次。第一点是说明用途,而第二点说明用法。很简单,只要在CoInitialize()后面调用一下就可以。但是请记住一定要用下面的方式去验证返回值:


HRESULT hr;

hr 
= CoInitialzieSecurity();
if (SUCCEED(hr) || RPC_E_TOO_LATE == hr)
{
    
do your work;
}

因为你如果在开发一个多线程的程序并且多人一起开发,你很可能不知道谁在你之前已经调了一次,而这种问题又很难去定位,特别是你没有别人代码的情况下。下面是四个返回值的说明:


This function supports the standard return value E_INVALIDARG, as well as the following: 

 

S_OK 

Indicates success.

RPC_E_TOO_LATE 

CoInitializeSecurity has already been called.

RPC_E_NO_GOOD_SECURITY_PACKAGES 

asAuthSvc was not NULL, and none of the authentication services in the list could be registered. Check the results saved in asAuthSvc for authentication service–specific error codes.

E_OUT_OF_MEMORY 

Out of memory.


strncpy_s( dest, _countof(dest), src, count );

并且这句代码不是在所有平台上都有问题。
这个我今天也是在牛人的帮助下才找出来的,而最大地问题是它出现在同一是双核的只是速度不同的w2k3机器上,一台百分百返回S_OK; 而另一台百分百返回RPC_E_TOO_LATE,而且用的同样的代码。所以初步怀疑是多线程时序的问题。不得不承认调试很难^_^。顺便提一句,大家看到这样的代码hang在那里会有什么想法:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值