Проблема при вызове виртуальной функции через библиотеки Symbian - PullRequest
0 голосов
/ 06 января 2010

Настройки моего приложения для обмена мгновенными сообщениями указаны ниже:

  • Модуль интерфейса пользователя (exe)
  • Модуль плагина (полиморфная DLL, предоставляющая абстрактный интерфейс для различных протоколов модуля UI)
  • Несколько DLL-библиотек протоколов (DLL-библиотеки общих библиотек, которые реализуют соответствующие протоколы, такие как Jabber, ICQ и т. Д.)

Теперь меня попросили реализовать функцию кэширования списков контактов, а это означало выполнение операций ввода-вывода в файле.

Поскольку файловый ввод / вывод не может быть выполнен в протокольных DLL (он не может получить доступ к личной папке приложений) Я реализовал класс, производный от интерфейса абстрактного класса, в модуле интерфейса пользователя.

Затем я открыл абстрактный интерфейс для модуля Plugin и протокольных DLL.

Пусть этот абстрактный интерфейс будет называться MFileService.

Из протокола DLL я получаю экземпляр производного класса MFileService:

  1. Протокол DLL вызывает виртуальную функцию для объекта плагина, чтобы получить указатель на производный объект MFileService

  2. Плагин-объект вызывает виртуальную функцию в модуле интерфейса пользователя.

  3. Модуль пользовательского интерфейса создает экземпляр класса Dervied MFileService и возвращает его вызывающей стороне (объект плагина)

  4. Плагин объекта inturn возвращает его в DLL-библиотеку протокола.

Проблема в том, что мое приложение аварийно завершает работу с KERN-EXEC 3 на шаге 1, когда он вызывает виртуальную функцию объект плагина.

НАМЕКАЕТ:

  • Все вызовы виртуальных функций, выполняемые для объекта плагина из протокола DLL, успешно выполняются, за исключением недавно выполненного мной. добавлено.

  • Виртуальная функция, которую я недавно добавил в модуль плагина и интерфейса пользователя, возвращает указатель на MFileService.

  • Я не экспортировал ни одной из виртуальных функций, поскольку все они чисто виртуальные.

Ответы [ 2 ]

1 голос
/ 06 января 2010

Поскольку файловый ввод-вывод не может быть выполнен в протокольных DLL-библиотеках (он не может получить доступ к личной папке приложений)

Это на самом деле не так. Код DLL запускается в контексте процесса (exe) и может по существу делать все, что может делать основной exe, включая доступ к своей ячейке данных частного каталога.

1 голос
/ 06 января 2010

KERN-EXEC 3 обычно означает нарушение прав доступа. Это, вероятно, означает, что MFileService не был должным образом инициализирован в DLL плагина.

  1. Убедитесь, что MFileService создан правильно.
  2. Убедитесь, что проводка вызывает правильную точку входа в DLL. Обычно это первая функция в DLL (проверьте файл .def)
  3. Убедитесь, что подключаемая DLL действительно имеет допустимое значение для MFileService ПЕРЕД созданием протокола DLL.

Без кода я не могу дать вам больше подробностей, чем это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...