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

Is C++ COM interface for imported "RegExp.tlb" implicitly sharing memory between processes?

本文关键字:之间 内存 进程 共享 是否 tlb RegExp C++ COM 导入 接口      更新时间:2023-10-16

好时机。如果我的问题很奇怪,我很抱歉,但我对所面对的事情很陌生。

我的案例如下,我通过COM在C++中使用VBRegExp,如下所示:

#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内部有崩溃。由堆损坏/在具有不同参数的regExp方法的不同调用中随机访问无效内存引起。

我已经检查了regExp指针值,regExp->Pattern.GetAddress()等等。它们在不同的进程中是不同的。但是,当我添加了命名为Mutex并用它包装DoSomething()时,添加了进程间同步——崩溃DISSAPPEARD。这就是为什么我要问regExp是否在进程之间隐含地共享了一些东西?

您的代码正在处理居住在当前公寓中的COM接口指针。您已经知道COM初始化,所以如果您在STA中,则当前单元表示当前线程。可以保证接口指针的方法是可调用的,但该接口指针的后端可能会有所不同:它可以是直接实现的,也可以是将调用转移到实际对象所在的单元中的辅助对象(代理)。后者尤其可能处于另一个过程中。

这都是线程安全和"进程安全"的。参数与对实际对象的调用一起获取,然后再传输回来。调用者不必关心它是在处理真实对象还是代理,被调用者也不需要知道它是由实际调用者调用还是由助手存根调用。

话虽如此,上面的代码片段还是不错的。你发生的车祸肯定另有原因。