我们有一个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。
听起来像refcount是0,请尝试从C++端调用addref – Remko 2012-02-14 18:45:43
感谢Remko,您的解决方案运行良好。 我添加了pDispatch-> AddRef()调用,它工作。 – 2012-02-15 09:45:18
太棒了!我将它添加为答案,您可以接受它。 – Remko 2012-02-15 17:24:44