Я разрабатываю проект 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++
Программы на C++. Форум разработчиков
1745597402
Anonymous
Я разрабатываю проект C ++, который включает использование DLL для классов динамической загрузки и функций -членов. Моя цель состоит в том, чтобы иметь возможность динамической загрузки DLL через LoadLibrary и успешно найти символы функции члена класса, поддерживая горячее обновление DLL.
Конкретные вопросы:
). Я загружаю DLL непосредственно через LoadLibrary , который может быть успешно скомпилирован, и DLL поддерживает горячее обновление (то есть я могу заменить файл DLL во время запуска программы, и программа может продолжать работать).
[*] [b] case and -class functions [/b]: когда я использую C+ stec -функции. LoadLibrary Чтобы загрузить DLL без использования директивы #Pragma , программа не может найти символы функции члена класса. Короче говоря, LoadLibrary не может загрузить эти функции -члена, заставляя программу не выполнять должным образом. После этого LoadLibrary может правильно найти символы функции члена класса, и проблема, по -видимому, решается. Но это приводит к новым проблемам:
[b] Проблема горячего обновления [/b]: после загрузки 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
Подробнее здесь: [url]https://stackoverflow.com/questions/79582039/how-to-dynamically-load-a-c-class-dll-and-find-member-functions-through-loadli[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия