我们有一个包含TXTextControl (v13.0)的delphi应用程序。此应用程序使用C++动态链接库(用visual Studio2008编写)来处理语音识别。当动态链接库被初始化时,TXTextControl的DispatchInterface被从delphi应用程序传递到动态链接库,并存储起来以供以后使用。当在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中,在DLL初始化期间使用以下代码传递idispatch接口:
tmpRedit := TTxtextcontrol(tmpvocField.obj);
ires := gst.CreateNewDocument( tmpvocfield.DocID , tmpRedit.DefaultInterface , '');其中"tmpvocField.obj“是对delphi中的TXTextControl的引用。
可能的问题是什么?这是线程问题吗?我的意思是TXTextControl在线程1中,但文本识别事件在不同的线程(线程2)中,所以idispatch在第二个线程中不再有效?
感谢您的回复。保罗。
发布于 2012-02-16 01:24:19
在c++中,没有像Delphi那样对接口进行自动引用计数。您需要调用AddRef以确保refcount至少为1。
https://stackoverflow.com/questions/9280478
复制相似问题