2012-02-14 123 views
1

我们有一个delphi应用程序,其中包含一个TXTextControl(v。13.0)。 此应用程序使用C++ DLL(用Visual Studio 2008编写)来处理语音识别。当DLL被初始化时,TXTextControl的DispatchInterface从delphi应用程序传递到DLL并存储起来供以后使用。 当在DLL的代码内接收文本识别的事件,IDispatch接口参考TXTextControl用于调用对文本控制如下所述方法的setText:在Delphi应用程序中从C++ DLL中回调

try{ 
    CString val(text.c_str()); 
    this->_txtInterface.SetSelLength(0); 
    this->_txtInterface.SetSelText(val); 
    }catch(...){ 
    LOG4CXX_FATAL(getLogger(), "COM exception!"); 
    } 

    LOG4CXX_DEBUG(getLogger(), "OK"); 

存储在哪里_txtInterface的TXTextXontrol接口当DLL被初始化时。

但是,当调用接口时,什么也没有发生,并且下面的loge指令代码不被执行。似乎IDispatch接口不再有效。

在Delphi的IDispatch接口的DLL初始化期间与下面的代码传递:

tmpRedit := TTxtextcontrol(tmpvocField.obj); 
ires := gst.CreateNewDocument(tmpvocfield.DocID , tmpRedit.DefaultInterface , ''); 

其中 “tmpvocField.obj” 是Delphi的内参照TXTextControl。

可能是什么问题? 这是一个线程问题吗?我的意思是TXTextControl在线程1中,但文本识别事件是在不同的线程中(线程2),所以idispatch在第二个线程中不再有效?

感谢您的回复。 Paolo。

+1

听起来像refcount是0,请尝试从C++端调用addref – Remko 2012-02-14 18:45:43

+0

感谢Remko,您的解决方案运行良好。 我添加了pDispatch-> AddRef()调用,它工作。 – 2012-02-15 09:45:18

+0

太棒了!我将它添加为答案,您可以接受它。 – Remko 2012-02-15 17:24:44

回答

1

在C++中没有自动引用计数,就像Delphi为接口所做的那样。 您需要调用AddRef以确保refcount至少为1.