Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
7 / 6 / 2
Регистрация: 19.02.2018
Сообщений: 309
1

Пытаюсь создать и подключить dll библиотеку

03.09.2019, 20:49. Показов 1909. Ответов 2
Метки нет (Все метки)

Здравствуйте, всем. Пытаюсь создать и подключить dll библиотеку.
Понимаю, что вопрос кажется банальным, у меня не получается.

C++
1
2
3
4
5
6
7
8
9
10
11
#pragma once
#ifndef _DLLTEST_H_
#define _DLLTEST_H_ 
 
#include <iostream>
#include <stdio.h>
#include <windows.h> 
 
extern "C" __declspec(dllexport) void f();
 
#endif
#include "dlltest.h"

extern "C" __declspec(dllexport) void f()
{
GetModuleFileName(NULL, NULL, NULL);
std::cout << "\n\nThis function was called from "<< std::endl << std::endl;
std::cout << "NumberList(): ";
}
[/CPP]

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
// dllmain.cpp : Определяет точку входа для приложения DLL.
#include "pch.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;
}
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <conio.h>
typedef void(*f)();
using namespace std;
int main(){
    HINSTANCE hLib = LoadLibrary(L"Dll1");
    if (hLib == NULL)
    {
        cout << "Unable to load library!" << endl;
        return 0;
    }
 
    GetModuleFileName((HMODULE)hLib, NULL, NULL);
    cout << "Library loaded: "  << endl;
    f = (f)GetProcAddress((HMODULE)hLib, "f");
    if ((f == NULL))
    {
        cout << "Unable to load function(s)." << endl;
        FreeLibrary((HMODULE)hLib);
        return 0;
    }
    f();
    FreeLibrary((HMODULE)hLib);
    return 0;
};
Может я как-то, не так все сделал…

Добавлено через 1 час 18 минут
так решил, может есть книга про dll библиотеки?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
Библиотека  dll 
Сторона dll.
// pch.h: это предварительно скомпилированный заголовочный файл.
// Перечисленные ниже файлы компилируются только один раз, что ускоряет последующие сборки.
// Это также влияет на работу IntelliSense, включая многие функции просмотра и завершения кода.
// Однако изменение любого из приведенных здесь файлов между операциями сборки приведет к повторной компиляции всех(!) этих файлов.
// Не добавляйте сюда файлы, которые планируете часто изменять, так как в этом случае выигрыша в производительности не будет.
 
#ifndef PCH_H
#define PCH_H
 
// Добавьте сюда заголовочные файлы для предварительной компиляции
#include "framework.h"
 
#endif //PCH_H
 
framework.h
 
#pragma once
 
#define WIN32_LEAN_AND_MEAN             // Исключите редко используемые компоненты из заголовков Windows
// Файлы заголовков Windows
#include <windows.h>
 
DLLTEST.h
 
#pragma once
#ifndef _DLLTEST_H_
#define _DLLTEST_H_ 
 
#include <iostream>
#include <stdio.h>
#include <windows.h> 
 
extern "C" __declspec(dllexport) void f();
/*Вы путаете два понятия - соглашение о вызовах и декорацию имен.
 
Соглашение о вызовах (calling convention) определяет формат передачи аргументов в функцию.
Например, при _stdcall они передаются через стек, а затем удаляются оттуда вызываемой
функцией, в то время, как при _cdecl за очистку стека отвечает вызывающая сторона.
 
Декорация имен (name mangling) - "искажение" имен функций или данных во время экспорта.
Результат зависит от типа компоновки (extern "C" или extern "C++"), способа экспорта (DEF-файл
или директива __declspec(dllexport)) и типе соглашения о вызовах.
 
Чтобы в Visual C++ получить неискаженное имя, нужно или использовать DEF-файл, или
extern "C" + _cdecl.*/
#endif
DLLTEST.cpp
 
#include "dlltest.h"
 
extern "C" __declspec(dllexport) void f()
{
    std::cout << "f\n ";
}
 
dllmain.cpp
 
// dllmain.cpp : Определяет точку входа для приложения DLL.
#include "pch.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;
}
 
/* HINSTANCEhinstDLL, // обрабатывать модуль DLL 
DWORD fdwReason, // причина вызова функции
LPVOID lpReserved) {// зарезервирован 
// Выполнение действий в зависимости от причины вызова. 
switch (fdwReason){
case DLL_PROCESS_ATTACH:// Инициализировать один раз для каждого нового процесса. Возвращаем FALSE для сбоя загрузки DLL.
case DLL_THREAD_ATTACH:// Выполнить специфичную для потока инициализацию. 
case DLL_THREAD_DETACH: // Выполнить специфичную для потока очистку.
case DLL_PROCESS_DETACH: // Выполнить любую необходимую очистку. */  
 
подключаем 
#include <conio.h>
using namespace std;
 
int main(){
    HINSTANCE hLib = LoadLibrary(L"Dll1");/*Загpужает поименованный модуль библиотеки. Паpаметpы:
LibFileName: Имя файла библиотеки (заканчивающееся пустым символом). Возвpащаемое значение: В случае успешного завеpшения 
- идентификатоp экземпляpа модуля библиотеки; если нет: (0) нет памяти; (5) попытка связать задачу; 
(11) невеpный файл EXE; (12) пpикладная задача из OS/2; (13) пpикладная задача из DOS 4.0; (14) невеpный тип EXE; 
(15) незащищенный pежим.*/
    if (hLib == NULL){cout << "Unable to load library!\n";
        return 0;}
 
    GetModuleFileName((HMODULE)hLib, NULL, NULL);/*Функция GetModuleFileName позволяет получить полный путь для указанного модуля.
DWORD GetModuleFileName(  HMODULE hModule, LPTSTR lpFilename,  DWORD nSize);
Параметры hModule [на входе] Дескриптор модуля, чей путь мы хотим узнать. Если этот параметр равен NULL, GetModuleFileName 
возвратит путь текущего модуля. lpFilename [на выходе] Указатель на буфер, который будет содержать строку, с полным путём 
модуля. Если длина пути превышает размер, указанный в параметре nSize, то функция вернёт путь, но он будет обрезан до nSize 
символа и может не содержать в конце нулевого символа.
 
nSize [на входе] Размер буфера lpFilename в TCHAR-ах. Возвращаемое значение Если функция выполнена успешно, 
то возвращаемое значение, это длина строки, скопированной в буфер в TCHAR-ах. Если буфер слишком мал для хранения имени 
модуля, то строка будет обрезана до nSize символа, а функция вернёт значение nSize. Если при выполнении функции возникнет 
ошибка, то возвращаемое значение будет равно нулю.*/
    void (*f)();
    (FARPROC&)f = GetProcAddress(hLib, "f");/*Функция GetProcAddress Извлекает адрес экспортированной функции 
или переменной из указанной библиотеки динамической компоновки (DLL).
FARPROC WINAPI GetProcAddress( _In_ HMODULE hModule, _In_ LPCSTR  lpProcName);
параметры
hModule [in] Дескриптор модуля DLL, который содержит функцию или переменную. Функция LoadLibrary, LoadLibraryEx, 
LoadPackagedLibrary или GetModuleHandle возвращает этот дескриптор. Функция GetProcAddress не извлекает адреса из модулей,
которые были загружены с использованием флага LOAD_LIBRARY_AS_DATAFILE.
 
lpProcName [in] Имя функции или переменной или порядковый номер функции. Если этот параметр является порядковым значением, 
он должен быть в младшем слове; старшее слово должно быть нулевым.
 
Возвращаемое значение Если функция завершается успешно, возвращаемое значение является адресом экспортируемой функции или переменной.
Если функция завершается ошибкой, возвращаемое значение равно NULL. */
    
    if (f == NULL) {cout << "not this function\n"; FreeLibrary((HMODULE)hLib);
        return 0;}
    f();
 
    FreeLibrary((HMODULE)hLib);
    return 0;
};
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.09.2019, 20:49
Ответы с готовыми решениями:

Как подключить библиотеку i7000.dll?
у меня есть библиотека i7000.dll библиотека необходимая для работы с com портами все остальное...

Не могу подключить библиотеку opengl - glaux.dll
Доброго дня! Не могу подключить библиотеку glaux. lib закинул куда надо, h-ник тоже, но все равно...

Как подключить x86 dll библиотеку к x64 проекту
Планировал написать дополнение к моему коду на ассемблере. Но возникла проблема. Компилятор x64 в...

Как создать dll библиотеку
Не могу разобраться как зоздать библиотеку ! Захожу в File-&gt;New project-&gt;Consol Application Win32-&gt;...

2
Нарушитель
1486 / 1288 / 485
Регистрация: 16.08.2014
Сообщений: 5,415
Записей в блоге: 1
03.09.2019, 20:55 2
Цитата Сообщение от Егор Щербанов Посмотреть сообщение
так решил, может есть книга про dll библиотеки?
тут вроде комфортно описано, и тут еще.
0
7 / 6 / 2
Регистрация: 19.02.2018
Сообщений: 309
03.09.2019, 21:30  [ТС] 3
_stanislav, Спасибо большое за Ваш ответ. Понимаете мой lua плагина Для GTA Vice City требует, чтобы на компьютере была установлена lua. Хочу эту тему решить через dll. Чтобы не нужна была установка lua.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.09.2019, 21:30

Как создать dll библиотеку из файла заголовка
прошу, сильно не кидайтесь кирпичами, за незнанием с++ пришлось прибегнуть к вашей помощи, имеется...

Как создать файл DLL так, чтобы его можно было подключить к VBA Excel?
Пытаясь научиться подключать к VBA хотя бы самую тривиальную функцию на C++. Для примера написал...

Как подключить dll на C# к проекту (dll) на С++
Подскажите, пожалуйста, как подключить dll на C# к проекту (dll) на С++. В интернете много...

Как подключить библиотеку
Opengl. Вроде все по инструкции скачал и раскидал по папкам. Если не ошибаюсь мне осталось что-то...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.