C++ DLL библиотека

257
17 ноября 2017, 08:23

Всем привет. Реализовал библиотеку, все отлично, оно работает. Но вот не знаю как динамически ее подключить функцию вызвать это понятно как, а вот конструктор не ясно. Конечно можно создать еще один метод и через него работать, но хотелось бы разобраться с конструктором. Мне подсказали что можно через 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);
Answer 1

Никак не вызвать. Даже если "конструктор" и есть в таблице экспорта, он там не для того, чтобы Вы вызывали его руками.

Сделайте функцию Create и вызывайте её.

Answer 2

Ни указатели на конструкторы, ни указатели другие методы экспортируемого класса, получить через GetProcAddress нельзя. Точнее просто указатель из экспортной таблицы получить можно (разобравшись с декорированием имен или переназначив недекорированные имена), но он будет бесполезен. Более того, конструкторы являются специальными функциями (special member functions) и С++ в принципе не предоставляет возможности вызывать их вручную. Если хотите подгружать библиотеку сами, то вам надо будет сделать к ней C интерфейс с какой-нибудь функцией Create, как уже писали ранее.

READ ALSO
Таймер win32 на С++

Таймер win32 на С++

Здравствуйте, выполняю задания на С++ и всё хорошо, только вот проблема с таймеромВот кусок самого задания:

325
Не запускается проект на Qt? [требует правки]

Не запускается проект на Qt? [требует правки]

Не запускается проект на Qt,после того как начал добавлять свои файлы,написанный на с++

262
В чем ошибка скрипта jquery?

В чем ошибка скрипта jquery?

Задача: скрипт определяет высоту блока в зависимости от наличия отсутствия в теле body другогоЯ использовал следующий вариант:

297