跨Symbian DLL调用虚函数的问题

时间:2010-01-06 06:21:21

标签: c++ dll function symbian virtual

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

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

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

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

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

让抽象接口命名为MFileService。

从协议DLL中我得到了一个MFileService派生类的实例:

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

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

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

  4. 插件对象inturn将其返回到协议DLL。

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

    HINTS:

    • 从协议DLL对插件对象进行的所有虚函数调用都是成功的,除了我最近的调用 加入。

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

    • 我没有导出任何虚拟功能,因为它们都是纯虚拟的。

2 个答案:

答案 0 :(得分:1)

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

  1. 检查以确保正确创建MFileService。
  2. 检查线束是否正在调用DLL中的正确入口点。这通常是DLL中的第一个函数(检查.def文件)
  3. 在创建协议DLL之前,检查插件DLL是否实际上具有MFileService的有效值。
  4. 没有代码,我不能给你更多细节。

答案 1 :(得分:1)

  

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

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