COM-объект - закрытый набор данных - PullRequest
0 голосов
/ 21 сентября 2018

Я работаю над проектом Delphi.Это приложение, которое вызывает вычислительный механизм (в Delphi), который извлекает данные из базы данных Oracle.Проект работает, но у меня проблемы с отладкой.

Для отладки движка я создаю COM-объект с DLL вычислительного движка;Я заставляю приложение вызывать localhost (т.е. движок, работающий в моем COM-объекте).Затем я запускаю движок из кода (нажимаю Start в IDE) и запускаю приложение, которое вызывает движок.Обычно это работает как талисман - код останавливается на точках останова, которые я установил в коде двигателя.

Но через несколько дней, каждый раз, когда я пытаюсь это сделать, я получаю сообщение об ошибке, сгенерированное тем фактом, что Dataset.State = dsInactive.Я ничего не изменил в коде, хотя;поток открывается между базой данных и моим компьютером (у меня ping и telnet в порядке).

Знаете ли вы, что может вызвать эту проблему?

Большое спасибо за вашу помощь!

РЕДАКТИРОВАТЬ 1: Большое спасибо MartynA за ваш ответ!

То, что вы описываете, действительно то, что я пытался сказать - хотя бы для начала:Я загрузил свой проект, который генерирует DLL в IDE, скомпилировал его и поставил точку останова, но на моей точке останова появилось сообщение об ошибке:

     procedure TRNParameters.SetDataset(ADataset: TClientDataSet);

begin
      if ADataset = nil then
        TRNException.RaiseTechnicalException('Erreur à la création de l''objet TRNParameters : le dataset des paramètres est nil');

      if ADataset.State = dsInactive then
        TRNException.RaiseTechnicalException('Erreur à la création de l''objet TRNParameters : le dataset des paramètres est fermé');

Полученное сообщение - второе, иточка останова на этой строке действительно достигнута - код переходит в «если» - в момент, непосредственно перед отображением сообщения.

Я проверил стек вызовов и получаю:

URNParams.TRNParameters.SetDataset($31345F0)
URNParams.TRNParameters.Create(???,nil)
SCEPlgFRObjectImpl.TSCEPlgFRObject.MtsDataModuleCreate(???)
:02ce0a2a TDataModule.DoCreate + $2E
:02ce086c TDataModule.Create + $E0
:02d31b70 TRemoteDataModule.Create + $38
:02d792af TComponentFactory.CreateComObject + $F
:02ccda34 TComObjectFactory.CreateInstance + $1C
:02d79211 TComponentFactory.CreateInstance + $C5
:75c58bc6 ; C:\windows\syswow64\ole32.dll
:75c73060 ; C:\windows\syswow64\ole32.dll
:7662a419 ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7662ad82 ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7662adf9 ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7662ae0f ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7662aea1 ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7662af94 ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:765d93ca ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:765d93aa ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7666b7ee ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:7666b9d2 ; C:\WINDOWS\SysWOW64\COMSVCS.DLL
:76271287 msvcrt._itow_s + 0x4c
:76271328 msvcrt._endthreadex + 0x6c
:7594343d kernel32.BaseThreadInitThunk + 0x12
:778e9802 ntdll.RtlInitializeExceptionChain + 0x63
:778e97d5 ntdll.RtlInitializeExceptionChain + 0x36

Итак, я думаю, что проблема связана со строкой SCEPlgFRObjectImpl.TSCEPlgFRObject.MtsDataModuleCreate (???).Поэтому я установил точку останова в MtsDataModuleCreate, и в итоге получил более точное сообщение об ошибке:

    try
    OraSessionFRA_SPU.Open;
  except
    on e: Exception do
    begin
      WriteLog('SCEPlgFR - ConnectDatabase : ConnectString=' + OraSessionFR_SPU.ConnectString);
      WriteLog('SCEPlgFR - ConnectDatabase : ' + e.Message);
      raise Exception.Create('SCEPlgFR - ConnectDatabase : ' + #13#10 + e.Message);
    end;
  end;

Но!Сообщение недоступно (из-за оптимизации)!Вы знаете, как мне удается прочитать это сообщение?

Кроме того, я не знаю, как найти, где создается COM-объект, это кусок кода, который должен быть в моем Delphi-коде?(извините, я новичок в Delphi и COM-объектах!)

Большое спасибо за вашу помощь!

РЕДАКТИРОВАТЬ 2

Привет всемЯ создал строковую переменную Mess и добавил Mess:=e.Message, чтобы перехватить сообщение об ошибке.Я получил «ORA-12154: TNS: не удалось разрешить указанный идентификатор подключения».

Думаю, я смогу найти выход из этого.Большое спасибо, MartynA, ты мой супергерой!

РЕДАКТИРОВАТЬ 3 Привет всем, вот решение проблемы: мой Delphi не смог найти TNS с необходимой связью.(Возможно, из-за конфликтующих установок, которые мне пришлось сделать, чтобы разработать разные программы, работающие с разными оракулами).Таким образом, причина, по которой набор данных не может быть открыт, заключается в том, что подключение к базе данных было невозможно (потому что нет доступа к нужному TNS).Коллега заставил меня создать переменную среды TNS_ADMIN, путь которой направлен на нужный TNS.Это решило мою проблему.

Еще раз спасибо за вашу помощь!

1 Ответ

0 голосов
/ 21 сентября 2018

Я не собираюсь рассуждать о том, что могло вызвать изменение в поведении вашего приложения: если вам нужна помощь с этим, вам нужно будет предоставить MCVE .Проблема, конечно, в том, что если бы вы могли предоставить MCVE, вы бы знали достаточно для выявления и устранения проблемы в любом случае.

Но я думаю, что вы должны быть в состоянии найти и исправить ошибку самостоятельно довольно простым способом.Отладка .DLL из среды IDE Delphi:

Вы сможете отладить это из среды IDE:

  • Загрузить свой проект, который генерирует .Dll вIDE, скомпилируйте его и поставьте точку останова в точке, где он создает COM-объект.

  • Затем запустите любой процесс, вызывающий COM-объект, и точка останова должна отключиться, чтобы вы могли создать выполнение оттуда.

Вы пробовали это?Возможно, это то, что вы пытаетесь сказать в своем q, за исключением того, что вы говорите: «Затем я запускаю движок из кода (нажимая Start в IDE), и запускаю приложение, которое вызывает движок».что не звучит правильно, если COM-объект размещен в DLL.

Если создание COM-объекта приводит к исключению, отладчик должен отловить это, чтобы вы могли видеть это из стека вызовов (используя View |Отладка Windows | Call stack) именно там, где происходит исключение.Обычно достаточно просто посмотреть на стек вызовов, чтобы определить причину.

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