我正在从事Delphi项目。它是一个调用计算引擎(在Delphi中)的应用程序,该引擎从Oracle数据库检索数据。该项目有效,但调试时遇到麻烦。
要调试引擎,我用计算引擎的dll创建一个COM对象;我让应用程序调用本地主机(即,在我的COM对象中运行的引擎)。然后,我从代码启动引擎(在IDE中按Start),然后启动应用程序,该应用程序将调用引擎。它通常像一个超级按钮一样工作-代码在我在引擎代码中设置的断点处停止。
但是几天以来,每次我尝试这样做时,都会收到由于Dataset.State = dsInactive这一事实而产生的错误消息。我没有更改代码中的任何内容;在数据库和我的计算机之间打开了该流(I 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é');
我收到的消息是第二条消息,并且确实在该消息显示之前的那一刻,确实达到了该行的断点-代码在“ if”中。
我检查了调用堆栈,得到了:
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。 (也许是因为要使用不同的oracle飞行员开发不同的软件而不得不进行的安装冲突)。 因此,无法打开数据集的原因是因为无法连接到数据库(因为无法访问正确的TNS)。一位同事让我创建了TNS_ADMIN环境变量,该变量指向所需的TNS。它解决了我的问题。
再次感谢您的帮助!
答案 0 :(得分:0)
我不会推测可能导致应用程序行为更改的原因:如果您需要帮助,则需要提供MCVE。当然,问题在于,如果您可以提供MCVE,则您将足够了解以找出并解决问题。
但是我认为您应该可以通过直接在Delphi IDE中调试.DLL来以一种非常直接的方式自己定位并修复错误:
您应该能够在IDE中进行调试:
将生成.Dll的项目加载到IDE中,对其进行编译,然后在创建COM对象的位置放置一个断点。
然后,启动任何调用COM对象的过程,断点将触发,因此您可以从那里创建执行。
您尝试过吗?这可能就是您要在q中说的,除了您说“然后我从代码启动引擎(按IDE中的Start),然后启动应用程序,该应用程序调用引擎”。如果COM对象托管在DLL中,则听起来不正确。
如果创建COM对象导致异常,调试器应捕获该异常,以便您可以从调用堆栈(使用“视图” |“调试Windows” |“调用”堆栈)看到发生异常的确切位置。通常,仅查看调用堆栈就足以确定原因所在。