1

美好时光。对不起,如果我的问题很奇怪,但我对我所面临的事情很陌生。

我的情况如下,我通过 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. 我做的一切都正确吗?(ps 我知道 CoInit 和 CoUninit,但问题不在于它们)。

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

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

4

1 回答 1

1

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

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

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

于 2013-08-12T17:22:11.703 回答