【问题标题】:Upgrade websnap app to delphi 2005 - CoInitialize error将 websnap 应用程序升级到 delphi 2005 - CoInitialize 错误
【发布时间】:2011-09-01 16:25:09
【问题描述】:

我们有一个用 Delphi 6 websnap 编写的当前产品,我正在尝试升级它以在 delphi 2005 下运行。 它使用ADO,运行时的错误是“CoInitialize has not been called”。 我能找到的对这个错误的唯一引用指向 IntraWeb 和称为 ServerController 的东西,我不确定它是否与我相关。 任何次数的 CoInitialize(nil) 调用均无效。

我是在浪费时间让它运行还是可以在 2005 年或更高版本下运行?

【问题讨论】:

    标签: delphi ado


    【解决方案1】:

    CoInitialize 需要在执行 COM 访问的线程中调用(例如,在任何通过 ADO 访问数据库的线程中)。 Delphi默认在主线程中调用,但需要在其他线程中显式调用。

    尝试在OnActivate 事件中调用它,并在OnDeactivate 事件中调用CoUninitialize

    还要确保您的 ADOTables 和 ADOConnections 在设计时未打开。否则应用程序会在您调用 CoInitialize 之前尝试使用 COM。

    如果一切都失败了 - 尝试覆盖 Web 表单的构造函数,并在调用继承之前将 CoInitialize 滑入其中。不要忘记在析构函数中调用CoUninitialize

    【讨论】:

    • 感谢您的回复,但我不确定 websnap 中的线程是什么。我已经在各种激活事件中尝试过 CoInitialize,但似乎没有执行到它们。还尝试了初始化部分,它确实运行但没有帮助。
    • +1 表示史蒂夫的回答,但您可以制作一个简单的 COM 初始化单元并将其作为项目源代码使用子句中的第一个单元。将 CoInitialize 放在初始化部分,将 CoUninitialize 放在完成部分。
    • 谢谢斯图尔特,但我已经有效地尝试过了。我可以单步执行调用 CoInit 的代码行,应用程序运行。当我第一次点击网页时,它给了我错误。即使我使用 F7,我也看不到我自己的任何代码。所以我认为问题是 - WebSnap 可以与 delphi 2005 和 ADO 一起使用吗?
    • @Petebr - 您已将一个事件处理程序连接到您的 PageModule.OnActivate,但它没有被命中?
    • 正确。我已将 CoInit 和断点放在主页 (WebAppPageModule) 和我的 dataModule (TWebDataModule) 上 onCreate、onActivate 和初始化部分,并且只到达 init 部分。已在整个项目中搜索打开的数据集,但在收到第一个请求之前没有打开任何内容,但从未到达该代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2012-05-04
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多