Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
15 / 0 / 0
Регистрация: 30.09.2015
Сообщений: 18
1

Использование собственной DLL

30.05.2017, 04:13. Показов 1080. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Имеется файл 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
#include <Windows.h>
 
 
int WINAPI DllMain(HINSTANCE hInstance, DWORD fdw, PVOID pv)
{
    return TRUE;
}
 
 
extern "C" _declspec (dllexport) int CALLBACK TextRect(HDC hDC, RECT rect, char* str)
    {
        int length = strlen(str);
        SIZE sz;
        GetTextExtentPoint32(hDC, str, length, &sz);
        Rectangle(hDC, rect.left, rect.top, rect.right, rect.bottom);
        TextOut(hDC, (rect.right - rect.left - sz.cx) / 2 + rect.left, (rect.bottom - rect.top - sz.cy) / 2 + rect.top, str, length);
 
        return 0;
    }
 
extern "C" _declspec (dllexport) int CALLBACK SumInt(int x, int y)
{
    return x + y;
}
и файл программы, в которой она используется:
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
#include <Windows.h>
 
using namespace std;
 
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam);
HWND hWnd;
 
HINSTANCE hDllInstance;
 
typedef int(CALLBACK *TextRectDll)(HDC hDC, RECT rect, char* str);
typedef int(CALLBACK *SumIntDll)(int x, int y);
 
 
 
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    hDllInstance = LoadLibraryEx("MyDLL.dll", 0, DONT_RESOLVE_DLL_REFERENCES);
 
    WNDCLASSEX wc;
    MSG msg;
 
    ZeroMemory(&wc, sizeof(WNDCLASSEX));
    wc.cbSize = sizeof(WNDCLASSEX);
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = WinProc;
    wc.hInstance = hInstance;
    wc.hCursor = LoadCursor(0, IDC_ARROW);
    wc.hIconSm = LoadIcon(0, IDI_APPLICATION);
    wc.lpszClassName = "WinClass";
 
    RegisterClassEx(&wc);
    hWnd = CreateWindow("WinClass", "Untitled", WS_OVERLAPPEDWINDOW, (GetSystemMetrics(SM_CXSCREEN) / 2) - 300, (GetSystemMetrics(SM_CYSCREEN) / 2) - 300, 600, 600, 0, 0, hInstance, 0);
 
    ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);
 
    while (GetMessage(&msg, 0, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
 
    return (int)msg.wParam;
}
 
LRESULT CALLBACK WinProc(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
 
    HDC             hDC;
    PAINTSTRUCT     PaintStruct;
 
    switch (msg)
    {
 
    case WM_PAINT:
    {
                     hDC = BeginPaint(hWnd, &PaintStruct);
 
                     SumIntDll SumInt = (SumIntDll)GetProcAddress(hDllInstance, "_SumInt@8");
                     TextRectDll TextRect = (TextRectDll)GetProcAddress(hDllInstance, "_TextRect@24");
 
                     RECT rc;
                     SetRect(&rc, 100, 100, 400, 400);
 
                     TextRect(hDC, rc, "Text");
 
                     
                     EndPaint(hWnd, &PaintStruct);
 
                     return 0;
    }
 
    case WM_DESTROY:
    {
                       FreeLibrary(hDllInstance);
                       PostQuitMessage(0);
                       return 0;
    }
 
 
    }
    return DefWindowProc(hWnd, msg, wParam, lParam);
}
Функция SumInt прекрасно работает - выдает сумму двух переданных ей чисел. А вот функция TextRect работать не хочет (хотя указатель не пустой, т.е. что-то туда линкуется). В окошке OutPut каждый раз при использовании этой функции вылезает сообщение "First-chance exception at 0x00002360 in DLL Test.exe: 0xC0000005: Access violation executing location 0x00002360.". В чем тут проблема?

И ещё вопрос, чтобы получить указатели на функции мне приходится использовать не указанные мной имена, а исковерканные (_SumInt@8 и _TextRect@24) - я их получил просмотрев созданную dll в dumpbin /exports. Что нужно сделать, чтобы имена не коверкались и оставались первоначальными?

Добавлено через 1 час 17 минут
Да и еще, если подключать эту dll статически, т.е. добавляя в проект lib и h файлы, вместо использования loadlibrary / GetProcAddress, то эта функция также нормально работает. Не хочет исполняться только при динамическом включении.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.05.2017, 04:13
Ответы с готовыми решениями:

Использование функции из собственной dll библиотеки
Добрый день. Я изучаю dll библиотеки и у меня возникло затруднение. Я написал dll библиотеку для...

Использование функции из c# (в виде dll) в собственной ОС
Здравствуйте, пытаюсь написать свою операционную систему и задался вопросом: Могу ли я написать...

Создание собственной DLL
Хочу сделать свою dll библеотеку , Только вот ничего не понимаю Можете научить? Очень прошу мне...

Обратиться к собственной форме из DLL
Я из другого языка и что-то не могу разобраться с доступами классов. Форма запускается из DLL....

1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
30.05.2017, 08:44 2
Цитата Сообщение от Meph2015 Посмотреть сообщение
Функция SumInt прекрасно работает - выдает сумму двух переданных ей чисел. А вот функция TextRect работать не хочет (хотя указатель не пустой, т.е. что-то туда линкуется). В окошке OutPut каждый раз при использовании этой функции вылезает сообщение "First-chance exception at 0x00002360 in DLL Test.exe: 0xC0000005: Access violation executing location 0x00002360.". В чем тут проблема?
А зачем ты используешь LoadLibraryEx с флагом DONT_RESOLVE_DLL_REFERENCES?
Вот что MSDN про него пишет:
If this value is used, and the executable module is a DLL, the system does not call DllMain for process and thread initialization and termination. Also, the system does not load additional executable modules that are referenced by the specified module.
Используй просто LoadLibrary.

Цитата Сообщение от Meph2015 Посмотреть сообщение
И ещё вопрос, чтобы получить указатели на функции мне приходится использовать не указанные мной имена, а исковерканные (_SumInt@8 и _TextRect@24) - я их получил просмотрев созданную dll в dumpbin /exports. Что нужно сделать, чтобы имена не коверкались и оставались первоначальными?
Используй DEF-файл вместо __declspec(dllexport). И имена не будут искажаться.
1
30.05.2017, 08:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.05.2017, 08:44
Помогаю со студенческими работами здесь

Использование собственной функции в BindingSource Filter
Добрый день ! Стоит задача фильтровать данные в BindingSource с использованием своей функции....

Использование стандартных библиотек к своей собственной
Ребят, помогите пожалуйста! Дело в том, что я пытаюсь написать свою библиотеку с процедурой,...

Использование MSVS 2010 в собственной школе программирования
Здравствуйте. Я хочу открыть школу программирования, и вопрос следующий, могу ли я установить на...

Использование String Tables в .dll(.dll.mui) (Для VB .NET)
Здравствуйте. Нужно извлечь(а потом запоковать) таблицу строк(string tables ). Допустим есть...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru