【问题标题】:Delphi - Error in using TTable in DataModule in DLLDelphi - 在 DLL 的 DataModule 中使用 TTable 时出错
【发布时间】:2011-12-08 18:01:37
【问题描述】:

我有一个运行良好的应用程序... 移植它以作为 DLL 实现。 我有一个数据模块,上面有我的数据库和 TTable 组件...... 在设计模式下,数据库设置为活动。 表指向数据库,它们被设置为活动的。 我可以右键单击表格,进入字段编辑器,然后查看所有列,所以我知道结构/属性设置良好....

问题出在运行时... 它在这条线上给了我一个 AV...

 if MyDataModule.DB1.Connected = True then
  ShowMessage('Active')
   else 
 ShowMessage('Not Active');

我在网上看到提示,需要做一些特殊的事情才能在 DLL 中使用数据模块,但我没有得到任何工作。

具体错误信息为:

模块“DocAssistCom.dll”中地址 06D4E22E 的访问冲突读取地址 0000070'

【问题讨论】:

  • 您确定要在使用它之前为数据模块创建一个实例吗?
  • 正如@RRUZ 指出的那样,请注意数据模块(添加到 VCL 表单应用程序时)是自动创建的(如果您查看项目源代码),而当您创建 dll 时,您需要手动创建在可以对其上的组件进行任何调用之前创建数据模块的实例,即访问数据库
  • 请注意以备将来参考:任何时候您的手指输入短语AV、access violation、'error, or exception`,他们应该开始输入的下一件事就是精确 您收到的错误消息,包括任何内存地址或错误代码。对于试图帮助您解决问题的人来说,说“它给了我一个 AV”绝对没有用;错误消息可以极大地加快速度(即使它对您毫无意义),更快地为您提供解决方案。谢谢。 :)
  • 可能性...所以我添加了 MyDataModule := tdm_Text.Create(nil);到初始化部分。为了测试这一点,我还在 DataModule.OnCreate 事件中添加了一个 ShowMessage。在调用业务代码之前,我确实看到了这一点。

标签: delphi dll datamodule


【解决方案1】:

您应该验证MyDaModule 确实已创建,然后在尝试使用MyDataModule.DB1.Connected 之前也已创建MyDataModule.DB1。

if Assigned(MyDataModule) then
  if Assigned(MyDataModule.DB1) then
    if MyDataModule.DB1.Connected = True then
      ShowMessage('Active')
    else 
      ShowMessage('Not Active')
  else
    ShowMessage('MyDataModule.DB1 not assigned')
else
  ShowMessage('MyDataModule not assigned');

但当您尝试使用它们时,它们可能仍未完全创建并准备好。

因此,与其传播ShowMessage 调用,我宁愿使用OutputDebugstring 并在IDE 中调试DLL 来查看代码路径...

注意: 我不知道您使用的是哪个版本的 Delphi 和 Windows,但请注意 TTable 需要 BDE(如今已被弃用)...

【讨论】:

  • DataModule 没有被分配....但是我收到了来自 DataModule.OnCreate 事件的消息。我已将 DM 变量设置为全局变量,但这个 .pas 文件无法“看到”它,但它编译得很好。至于OutputDebugString,没听说过...很高兴知道...
  • 已解决:我必须手动创建数据模块,然后我还必须从 USES 子句中删除 MyDataModule.pas 文件;某种类型的范围界定问题也在蔓延……
  • 您是否重用了与单元中相同的全局 MyDataModule 变量名称?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多