gpt4 book ai didi

c++ - 导入的 "RegExp.tlb"的 C++ COM 接口(interface)是否在进程之间隐式共享内存?

转载 作者:太空宇宙 更新时间:2023-11-04 11:51:07 24 4
gpt4 key购买 nike

好时机。对不起,如果我的问题很奇怪,但我对我遇到的事情很陌生。

我的情况如下,我通过 COM 在 C++ 中使用 VB RegExp,如下所示:

#import "RegExp.tlb" no_namespace
...
void DoSomething() {
...
static IRegExpPtr regExp( __uuidof(RegExp) );
regExp->Pattern = A2BSTR(m_szStrReg); // read on dll load from the file
if ( regExp->Test(someString) ) {
IMatchCollectionPtr matches = regExp->Execute(someString);
// my staff here
...
}
...
}

我的问题是:

  1. 我做得对吗? (附:我知道 CoInit 和 CoUninit,但问题不在于它们)。

  2. regExp 进程安全吗? 我问这个问题的原因是我的类有多个实例 DoSomething()多次调用它。我在 regExp 内部有 CRASH。由具有不同参数的 regExp 方法的不同调用中随机堆损坏/无效内存访问引起。

我已经检查了 regExp 指针值、regExp->Pattern.GetAddress() 等等。而且它们在不同的过程中是不同的。但是,当我添加命名互斥锁并用它包装 DoSomething() 时,它添加了进程间同步 - 崩溃消失了。这就是为什么我要问 regExp 是否在进程之间隐式共享某些内容?

最佳答案

您的代码正在处理当前公寓中的 COM 接口(interface)指针。您已经了解 COM 初始化,因此如果您特别处于 STA 中,则当前单元意味着当前线程。您可以保证接口(interface)指针的方法是可调用的,但此接口(interface)指针的后端可能会有所不同:它可以直接实现,也可以是将调用转移到实际对象所在的单元的辅助对象(代理) .特别是后者可能在另一个过程中。

这都是线程安全和“进程安全”的。参数通过调用实际对象获取,然后传回。调用者不必关心它是在处理真实对象还是代理,被调用者也不需要知道它是由实际调用者调用还是由助手 stub 调用。

话虽如此,上面的代码片段还是不错的。您遇到的崩溃必须有其他原因。

关于c++ - 导入的 "RegExp.tlb"的 C++ COM 接口(interface)是否在进程之间隐式共享内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18192339/

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