从C++DLL中调用Delphi应用程序

Callback within Delphi application from within C++ DLL

本文关键字:Delphi 应用程序 调用 C++DLL      更新时间:2023-10-16

我们有一个delphi应用程序,它包含一个TXTextControl(v.13.0)。此应用程序使用C++DLL(使用visual studio 2008编写)来处理语音识别。当DLL初始化时,TXTextControl的DispatchInterface从delphi应用程序传递到DLL,并存储以供以后使用。当在DLL代码中接收到文本识别事件时,TXTextControl的IDispatch接口引用用于调用文本控件上的方法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接口。

但是当调用接口时,不会发生任何事情,也不会执行下面的loge指令代码。IDispatch接口似乎不再有效。

在delphi中,idispatch接口在DLL初始化期间传递以下代码:

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

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

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

感谢您的回复。保罗。

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