#cpp #visual_studio #visual_cpp #dll #library
Всем привет. Реализовал библиотеку, все отлично, оно работает. Но вот не знаю как динамически ее подключить функцию вызвать это понятно как, а вот конструктор не ясно. Конечно можно создать еще один метод и через него работать, но хотелось бы разобраться с конструктором. Мне подсказали что можно через virtual сделать. Сделал я класс виртуальным. Но все равно не получается подключится. Можете объяснить как это сделать? Заранее спасибо. Вот мой код: lib.h #pragma once #ifdef MATRIXDLL_EXPORTS #define MATRIXDLL_API __declspec(dllexport) #else #define MATRIXDLL_API __declspec(dllimport) #endif #include "stdafx.h" #includeusing namespace std; class MATRIXDLL_API matrix { int **p, m, n; public: matrix(int row, int col); // ~matrix() // { // delete [] p; // } void accept(); void display(); void test(); }; class interface_matrix : virtual public matrix { private: int **p, m, n; public: interface_matrix(int row, int col) : matrix(row, col); void accept(); void display(); void test(); }; lib.cpp // lab9.cpp: определяет экспортированные функции для приложения DLL. // #include "stdafx.h" #include #include "lib.h" using namespace std; matrix::matrix(int row, int col) { m = row; n = col; p = new int*[m]; for (int i = 0; i < m; ++i) { p[i] = new int[n]; for (int j = 0; j < n; ++j) p[i][j] = 0; } } void matrix::accept() { cout << "Enter matrix elements: "; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> p[i][j]; } } } void matrix::display() { cout << "The matrix is:\n"; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << p[i][j] << " "; } cout << endl; } } void matrix::test() { int K; cout << "Enter k: " << endl; cin >> K; display(); int R = p[K - 1][K - 1]; cout << endl; for (int d = 0; d < m; d++) { p[K - 1][d] = p[K - 1][d] / K; } display(); } interface_matrix::interface_matrix(int row, int col) : matrix(row, col) { m = row; n = col; p = new int*[m]; for (int i = 0; i < m; ++i) { p[i] = new int[n]; for (int j = 0; j < n; ++j) p[i][j] = 0; } } void interface_matrix::accept() { cout << "Enter matrix elements: "; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cin >> p[i][j]; } } } void interface_matrix::display() { cout << "The matrix is:\n"; for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { cout << p[i][j] << " "; } cout << endl; } } void interface_matrix::test() { int K; cout << "Enter k: " << endl; cin >> K; display(); int R = p[K - 1][K - 1]; cout << endl; for (int d = 0; d < m; d++) { p[K - 1][d] = p[K - 1][d] / K; } display(); } dllmain.cpp // dllmain.cpp: определяет точку входа для приложения DLL. #include "stdafx.h" BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved ) { switch (ul_reason_for_call) { case DLL_PROCESS_ATTACH: case DLL_THREAD_ATTACH: case DLL_THREAD_DETACH: case DLL_PROCESS_DETACH: break; } return TRUE; } Отдельно создал я создал проект где подключаю библиотеку. Пытаюсь вот так, но не выходит из-за конструктора. Как мне подключить? Если использовать статическую загрузку то все хорошо. HINSTANCE hDllInstance = LoadLibraryEx(L"lib.dll",0, DONT_RESOLVE_DLL_REFERENCES);
Ответы
Ответ 1
Никак не вызвать. Даже если "конструктор" и есть в таблице экспорта, он там не для того, чтобы Вы вызывали его руками. Сделайте функцию Create и вызывайте её.Ответ 2
Ни указатели на конструкторы, ни указатели другие методы экспортируемого класса, получить через GetProcAddress нельзя. Точнее просто указатель из экспортной таблицы получить можно (разобравшись с декорированием имен или переназначив недекорированные имена), но он будет бесполезен. Более того, конструкторы являются специальными функциями (special member functions) и С++ в принципе не предоставляет возможности вызывать их вручную. Если хотите подгружать библиотеку сами, то вам надо будет сделать к ней C интерфейс с какой-нибудь функцией Create, как уже писали ранее.
Комментариев нет:
Отправить комментарий