【问题标题】:Problem in calling a virtual function across Symbian DLLs跨 Symbian DLL 调用虚函数的问题
【发布时间】:2011-01-01 22:44:55
【问题描述】:

我的 IM 应用程序设置如下:

  • 用户界面模块 (exe)
  • 插件模块(一种多态 DLL,为 UI 模块的不同协议提供抽象接口)
  • 多个协议 DLL(实现各自协议的共享库 DLL,如 Jabber、ICQ 等)

现在,我被要求实现联系人列表缓存功能,这意味着执行文件 I/O。

由于无法在协议 DLL 中完成文件 I/O(它无法访问应用程序的私有文件夹) 我在用户界面模块中实现了一个派生自抽象类接口的类。

然后我将抽象接口暴露给插件模块和协议 DLL。

让这个抽象接口命名为 MFileService。

从协议 DLL 这就是我获取 MFileService 派生类实例的方式:

  1. 协议 DLL 调用插件对象上的虚函数以获取指向 MFileService 派生对象的指针

  2. 插件对象调用用户界面模块上的虚函数。

  3. 用户界面模块创建一个 MFileService 派生类的实例并将其返回给调用者(插件对象)

  4. 插件对象又将其返回给协议 DLL。

问题是我的应用程序在第 1 步对 KERN-EXEC 3 进行虚函数调用时崩溃了 插件对象。

提示:

  • 从协议 DLL 对插件对象的所有虚函数调用都成功,除了我最近的那个 已添加。

  • 我新添加到插件和用户界面模块的虚函数返回一个指向MFileService的指针。

  • 我没有导出任何虚函数,因为它们都是纯虚函数。

【问题讨论】:

    标签: c++ dll function symbian virtual


    【解决方案1】:

    由于无法在协议 DLL 中完成文件 I/O(它无法访问应用程序的私有文件夹)

    事实上并非如此。 DLL 代码在进程 (exe) 上下文中运行,基本上可以做任何主 exe 可以做的事情,包括访问其私有目录数据笼。

    【讨论】:

    • @laalto:我认为无法从 exe 外部进行文件访问。感谢您清除神话。
    【解决方案2】:

    KERN-EXEC 3 通常意味着访问冲突。这可能意味着 MFileService 没有在插件 DLL 中正确初始化。

    1. 检查以确保 MFileService 已正确创建。
    2. 检查线束是否正在调用 DLL 中的正确入口点。这通常是 DLL 中的第一个函数(检查 .def 文件)
    3. 在创建协议 DLL 之前,检查插件 DLL 是否确实具有 MFileService 的有效值。

    没有代码,我不能给你更多的细节。

    【讨论】:

    • 我认为问题出在#3。在创建协议 DLL 之前,我没有创建 MFileService 实例。但是,我不确定。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    相关资源
    最近更新 更多