Страницы

Поиск по вопросам

пятница, 27 декабря 2019 г.

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

#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"
#include 
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 
#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, как уже писали ранее.

Комментариев нет:

Отправить комментарий