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

  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是DLL初始化后存储的TXTextXontrol接口(interface)。

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

在delphi中,在DLL初始化期间,使用以下代码传递idispatch接口(interface):
tmpRedit := TTxtextcontrol(tmpvocField.obj);
ires := gst.CreateNewDocument( tmpvocfield.DocID , tmpRedit.DefaultInterface , '');

其中“tmpvocField.obj”是delphi中对TXTextControl的引用。

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

感谢您的任何回复。
保罗

最佳答案

在c++中,没有像Delphi那样对接口(interface)进行自动引用计数。
您需要调用AddRef以确保refcount至少为1。

09-17 20:31
查看更多