Всем привет. Реализовал библиотеку, все отлично, оно работает. Но вот не знаю как динамически ее подключить функцию вызвать это понятно как, а вот конструктор не ясно. Конечно можно создать еще один метод и через него работать, но хотелось бы разобраться с конструктором. Мне подсказали что можно через virtual сделать. Сделал я класс виртуальным. Но все равно не получается подключится. Можете объяснить как это сделать? Заранее спасибо. Вот мой код:
lib.h
#pragma once
#ifdef MATRIXDLL_EXPORTS
#define MATRIXDLL_API __declspec(dllexport)
#else
#define MATRIXDLL_API __declspec(dllimport)
#endif
#include "stdafx.h"
#include <iostream>
using 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 <iostream>
#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);
Никак не вызвать. Даже если "конструктор" и есть в таблице экспорта, он там не для того, чтобы Вы вызывали его руками.
Сделайте функцию Create
и вызывайте её.
Ни указатели на конструкторы, ни указатели другие методы экспортируемого класса, получить через GetProcAddress
нельзя. Точнее просто указатель из экспортной таблицы получить можно (разобравшись с декорированием имен или переназначив недекорированные имена), но он будет бесполезен. Более того, конструкторы являются специальными функциями (special member functions) и С++ в принципе не предоставляет возможности вызывать их вручную. Если хотите подгружать библиотеку сами, то вам надо будет сделать к ней C интерфейс с какой-нибудь функцией Create
, как уже писали ранее.
Здравствуйте, выполняю задания на С++ и всё хорошо, только вот проблема с таймеромВот кусок самого задания:
Не запускается проект на Qt,после того как начал добавлять свои файлы,написанный на с++
Задача: скрипт определяет высоту блока в зависимости от наличия отсутствия в теле body другогоЯ использовал следующий вариант: