gpt4 book ai didi

c - 我如何正确使用 CoInitialize() 和 CoInitializeSecurity() 就好像我没有调用后者以便我可以使用 IGlobalOptions?

转载 作者:太空宇宙 更新时间:2023-11-04 03:38:09 26 4
gpt4 key购买 nike

我的 UI 在调用 CoInitialize() 的 DLL 中提供,因此我可以使用 Common Item Dialog、shell 打开文件夹对话框。以及任何其他可能需要 COM 的仅适用于 Vista 的新东西(我不知道/还没有使用任何其他东西)。 DLL 还将为自定义控件提供一个 UI Automation 接口(interface)(我的 Table 控件来自过去的问题,我决定将其移至 UI Automation)。

我不想COM's "helpful" exception handling ;我希望我的 DLL 中的异常冒泡到 DLL,以便可以调试它们。然而,the documentation for IGlobalOptions说我需要事先调用 CoInitializeSecurity()

我有两个问题:

  1. 我是否调用 CoInitializeSecurity() 来代替 CoInitialize() 或与 CoInitialize() 一起调用?如果除了,我是在之前还是之后调用它?

  2. 如果我希望 COM 表现得好像我根本没有调用 CoInitializeSecurity(),调用会是什么?阅读 MSDN 后,我知道大部分参数应该是什么,但我不确定其中的一些参数。

    CoInitializeSecurity(
    NULL,
    -1, // or is the default 0 instead?
    /* can this be NULL? (the error returns table on MSDN implies it can...) if not, what should I specify? */,
    NULL,
    RPC_C_AUTHN_LEVEL_DEFAULT,
    /* what should this be? MSDN says RPC_C_IMP_LEVEL_DEFAULT isn't allowed */,
    /* can this be NULL? if not, what should I specify? */,
    /* what should this be? MSDN says EOAC_DEFAULT isn't allowed */,
    NULL);

    或者这在安全方面和默认方面都是完全错误的,还有更好的选择吗?

或者因为这是一个 DLL,我什至不应该做任何这些事情吗?

谢谢。

最佳答案

PS:我假设您的库不包含实际的 main() 代码。

My UI is provided in a DLL that calls CoInitialize()...

我希望您在自己的线程中执行此操作,否则您是在自找麻烦。

  1. Do I call CoInitializeSecurity()...

不要在库中执行此操作,这是一个进程范围的调用,它可能由应用程序本身完成,或者在第一次发生跨单元编码时完成。

  1. What would the invocation be...

我会说 this is it , 如果没有找到注册表信息。引用:

CoInitializeSecurity(NULL, -1, NULL, NULL, 
RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,
NULL, EOAC_NONE, NULL);

Or is this completely wrong both security-wise and defaults-wise and there's a better option?

有更好的选择。

一种是返回构造的 HRESULT 并将您的实际错误描述存储在您的 DLL 的全局变量之一中,可能使用线程本地存储。

如果您正在使用 ATL,您可能会使用这样的 HRESULT 并最终使用与您提供给 CComCoClass::Error 方法的相同信息,您的对象很可能将其用作模板继承。

或者只使用 ATL 的错误处理,这可能就足够了,因为您仍然可以为自己的代码断点。

Or should I not even bother doing any of this since this is a DLL?

它实际上取决于线程所有权。如果您拥有发生这种情况的线程,那没关系;如果不是,那显然是错误的。

但请考虑像我建议的那样的替代方案。

关于c - 我如何正确使用 CoInitialize() 和 CoInitializeSecurity() 就好像我没有调用后者以便我可以使用 IGlobalOptions?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30560589/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com