Я разрабатываю проект C ++, который включает использование DLL для классов динамической загрузки и функций -членов. Моя цель состоит в том, чтобы иметь возможность динамической загрузки DLL через LoadLibrary и успешно найти символы функции члена класса, поддерживая горячее обновление DLL.
Конкретные вопросы:
). Я загружаю DLL непосредственно через LoadLibrary , который может быть успешно скомпилирован, и DLL поддерживает горячее обновление (то есть я могу заменить файл DLL во время запуска программы, и программа может продолжать работать).
[*] case and -class functions : когда я использую C+ stec -функции. LoadLibrary Чтобы загрузить DLL без использования директивы #Pragma , программа не может найти символы функции члена класса. Короче говоря, LoadLibrary не может загрузить эти функции -члена, заставляя программу не выполнять должным образом. После этого LoadLibrary может правильно найти символы функции члена класса, и проблема, по -видимому, решается. Но это приводит к новым проблемам:
Проблема горячего обновления : после загрузки DLL, используя директиву #pragma , и программа работает и уже выгружает DLL, я пытаюсь заменить (перезаписывать) старый DLL с новым DLL, и это вызывает невыполнение, и это невыполняемое, что не может быть выполнено. Другими словами, при замене DLL, Explorer предлагает, чтобы файл DLL занят и не может быть заменен. /> Скомпилируйте успешно и поддерживайте горячие обновления. То есть, когда программа работает, я могу заменить файл DLL без проблемы занятого файла.PS D:\code\VS2022\CalcCPPlib> tree /f
Folder PATH list of volume local disk
The volume serial number is 9244-9555
D:.
│ CalcCPPlib.sln
│
├─CalcCPPlib
│ CalcCPPlib.vcxproj
│ CalcCPPlib.vcxproj.filters
│ CalcCPPlib.vcxproj.user
│ main.cpp
│
├─CalcCPPlib_dynamic
│ CalcCPPlib_dynamic.vcxproj
│ CalcCPPlib_dynamic.vcxproj.filters
│ CalcCPPlib_dynamic.vcxproj.user
│ operations.cpp
│ operations.h
│
└─x64
│ CalcCPPlib_dynamic.dll
│
└─Debug
CalcCPPlib.exe
CalcCPPlib.pdb
CalcCPPlib_dynamic.dll
CalcCPPlib_dynamic.exp
CalcCPPlib_dynamic.lib
CalcCPPlib_dynamic.pdb
PS D:\code\VS2022\CalcCPPlib>
< /code>
Вот мой код:
operations.h
#ifndef OPERATIONS_H
#define OPERATIONS_H
#ifdef DLLCLASS_EXPORTS
#define EXT_CLASS _declspec(dllexport)
#else
#define EXT_CLASS _declspec(dllimport)
#endif
// export class
class EXT_CLASS CMath
{
public:
int class_dll_add(int add1, int add2);
int class_dll_sub(int sub1, int sub2);
int class_dll_mul(int mul1, int mul2);
public:
int key = 10;
long value = 20;
};
#endif // OPERATIONS_H
< /code>
operations.cpp
#define DLLCLASS_EXPORTS
#include "operations.h"
// fist way use use extern "C" _declspec
extern "C" _declspec(dllexport) int dll_add(int add1, int add2)
{
CMath math;
return math.class_dll_add(add1, add2);
}
extern "C" _declspec(dllexport) int dll_sub(int sub1, int sub2)
{
return sub1 - sub2;
}
// second way use _declspec
_declspec(dllexport) int dll_mul(int mul1, int mul2)
{
return mul1 * mul2;
}
int CMath::class_dll_add(int add1, int add2)
{
return add1 + add2;
}
int CMath::class_dll_sub(int sub1, int sub2)
{
return sub1 - sub2;
}
int CMath::class_dll_mul(int mul1, int mul2)
{
return mul1 * mul2;
}
extern "C" __declspec(dllexport) CMath Stack_CreateMathObject()
{
return CMath();
}
< /code>
main.cpp
#include
#include
//#pragma comment(lib, "D:/code/VS2022/CalcCPPlib/x64/Debug/CalcCPPlib_dynamic.lib")
typedef int(*ADD)(int m, int n);
typedef int(*SUB)(int m, int n);
typedef int(*MUL)(int m, int n);
class CMath
{
public:
int class_dll_add(int add1, int add2);
int class_dll_sub(int sub1, int sub2);
int class_dll_mul(int mul1, int mul2);
public:
int key = 10;
long value = 20;
};
typedef CMath(*CreateMathObjectFunc)();
int main()
{
while (1)
{
{
HINSTANCE hDll = LoadLibrary(TEXT("CalcCPPlib_dynamic.dll"));
//HMODULE hDll = GetModuleHandle(L"CalcCPPlib_dynamic.dll");
std::cout
Подробнее здесь: https://stackoverflow.com/questions/795 ... ugh-loadli
Как динамически загрузить DLL класса C ++ и найти функции элементов через LoadLibrary, поддерживая обновление DLL Hot? ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение