2012-02-14 70 views
1

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

+1

聽起來像refcount是0,請嘗試從C++端調用addref – Remko 2012-02-14 18:45:43

+0

感謝Remko,您的解決方案運行良好。 我添加了pDispatch-> AddRef()調用,它工作。 – 2012-02-15 09:45:18

+0

太棒了!我將它添加爲答案,您可以接受它。 – Remko 2012-02-15 17:24:44

回答

1

在C++中沒有自動引用計數,就像Delphi爲接口所做的那樣。 您需要調用AddRef以確保refcount至少爲1.