2017-01-11 26 views
-1

Я хочу динамически загружать клиентскую dll в мое приложение на C++ Windows. Поэтому я использую ACE_DLL. Я хочу создать объект класса в dll клиента в своем приложении. Итак, я написал класс обертки. Одна из его функций-членов создает объект ACE_DLL. Затем, используя этот объект, я загружаю dll клиента. Затем я вызываю функцию символа через объект ACE_DLL и передаю измененное имя конструктора класса в dll клиента. Затем я вызываю указатель функции (_entry), который содержит адрес конструктора, но на этот раз я получаю ошибку как «Необработанное исключение (нарушение доступа)»Динамическая загрузка клиентской библиотеки C++ с использованием ACE_DLL, дающей ошибку как необработанное исключение

Пожалуйста, дайте мне знать, если мой подход верен. Ниже приведена последовательность вызовов в моем приложении.


ACE_DLL* _pDll; typedef Test* (*TestFP)(); TestFP _entry;


_pDll = new ACE_DLL();

_pDll->open("dllname_to_be_opend");

std::string sSymbol = "Test"; // искаженное название Test конструктор класса в DLL клиента

_entry = (TestFP) _pDll->symbol(sSymbol.c_str());

// Необработанное исключение при 0x00362b2f в Testdll.exe: 0xC0000005: нарушение прав доступа пишущего местонахождения 0x00362b0c.


Спасибо, Прасад

ответ

1

Это выглядит примерно правильно. Можете ли вы запустить ACE_wrappers/tests/DLL_Test.exe? Если это сработает, сравните тестовый код с вашим телом.

+0

Нет. Приложение My Test не работает. Предоставление ошибки как Необработанное исключение. Я смущен, если, я могу получить адрес конструктора класса Test в dll клиента с помощью метода symbol(), а затем вызвать этот указатель функции для создания объекта класса Test. –

+0

Если тестовая программа также не работает, это, скорее всего, проблема с сборкой. Я рекомендую сравнить настройку сборки с таблицей сборки (http://www.dre.vanderbilt.edu/scoreboard/), которая наиболее точно соответствует вашей среде и видит, что по-другому. Как только вы сможете запустить DLL_Test, вернитесь и повторите попытку своей программы. –

0

Код, который вы представили т.е.

_pDll = new ACE_DLL(); 
_pDll->open("dllname_to_be_opend"); 
std::string sSymbol = "Test"; 
_entry = (TestFP) _pDll->symbol(sSymbol.c_str()); 

не проверяет, что возвращаемое значение ACE_DLL::open вызова равна нулю (0 для успеха, -1 в случае неудачи), или что возвращаемое значение ACE_DLL::symbol вызова не равен нулю (0 возвращается при ошибке).