Обратный вызов в приложении Delphi из C ++ DLL - PullRequest
1 голос
/ 14 февраля 2012

у нас есть приложение delphi, которое содержит TXTextControl (v. 13.0). Это приложение использует C ++ DLL (написано с Visual Studio 2008) для обработки распознавания речи. Когда DLL инициализируется, DispatchInterface TXTextControl передается из приложения delphi в DLL и сохраняется для дальнейшего использования. Когда событие распознавания текста получено в коде DLL, ссылка интерфейса IDispatch на TXTextControl используется для вызова метода 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 - интерфейс TXTextXontrol, сохраняемый при инициализации DLL.

Но когда вызывается интерфейс, ничего не происходит, и следующий код инструкции loge не выполняется. Похоже, интерфейс IDispatch больше не действителен.

В delphi интерфейсу idispatch передается следующий код во время инициализации DLL:

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

где "tmpvocField.obj" - это ссылка на TXTextControl в delphi.

В чем может быть проблема? Это проблема многопоточности? Я имею в виду, что TXTextControl находится в потоке 1, но событие распознавания текста находится в другом потоке (поток 2), поэтому idispatch больше не действителен во втором потоке?

Спасибо за любой ответ. Паоло.

1 Ответ

1 голос
/ 15 февраля 2012

В c ++ нет автоматического подсчета ссылок, как Delphi для интерфейсов.Вам нужно вызвать AddRef, чтобы убедиться, что рефконт равен как минимум 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...