我們有一個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