Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.66/44: Рейтинг темы: голосов - 44, средняя оценка - 4.66
0 / 0 / 0
Регистрация: 12.06.2009
Сообщений: 4

Динамическая загрузка DLL

12.06.2009, 09:52. Показов 8684. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте,
У меня возникла проблема с динамической загрузкой библиотеки. Есть один файл - ****.dll , который нужно подключить к проекту на MS Visual C++ 2005. Пробывал динамическую загрузку как в :
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
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
typedef int(*functionDll)( const char *, char, int );
 
/*Сегмент данных*/
CHAR                wName[]                ="Dynamic link DLL";
CHAR                cName[]                ="Windowsclass";    
CHAR                lpszAppName[]        ="Application";                                
static HWND            hListBox            = NULL;                
static HWND            hExecute        = NULL;                                
 
HINSTANCE            hInstance;            
HINSTANCE            hDllInstance;
HWND                hwnd;                                                            
LPSTR                message        = new char[128];
char                mask            ='a';
CHAR                *lpEditInfo1        = new char[256];
 
/*Конец сегмента данных*/
/*Сегмент кода*/
 
LRESULT CALLBACK MainWinProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
    switch(msg)
    {
    case WM_PAINT:                                            
        break;
    case WM_CREATE:                                            
        {
            hListBox = CreateWindowEx(                        
                WS_EX_CLIENTEDGE,                            
                "LISTBOX", "",                                
                LBS_STANDARD|                                
                LBS_DISABLENOSCROLL|                        
                WS_CHILD|                                    
                WS_VISIBLE|                                
                WS_HSCROLL,                                    
                5, 25, 350, 400,                            
                hwnd,                                        
                NULL,                                        
                hInstance,                                    
                NULL                                        
                );
            hExecute = CreateWindowEx( 
                WS_EX_WINDOWEDGE, 
                "BUTTON", 
                "Выполнить",
                BS_PUSHBUTTON | 
                BS_TEXT | 
                WS_CHILD | 
                WS_VISIBLE,
                375, 25, 150, 30,
                hwnd, 
                NULL,
                hInstance, 
                NULL );
            SendMessage( hListBox, LB_RESETCONTENT, 0, 0 );
        }
        break;                                
    case WM_COMMAND :                                        
        {
            switch( LOWORD( wParam ) )                        
            {
            case BN_CLICKED:                                
                {    
                    if(lParam == (LPARAM)hExecute)
                    {
                        hDllInstance = LoadLibraryEx(
                            "MyDll.dll", 
                            0, 
                            DONT_RESOLVE_DLL_REFERENCES
                            );            //загружаем DLL
                        if(hDllInstance)
                        {
                            functionDll fpFunction = (functionDll)GetProcAddress(hDllInstance,"SymbolCounter");//получаем указатель
                            if(fpFunction)
                            {
                                lstrcpy(message, "Recieved message");
                                int n = fpFunction(message, mask, lstrlen(message));    //вот тут мы вызываем нашу функцию
                                wsprintf(lpEditInfo1, "A number of entries of symbol '%c' in string = %d", mask, n);
                                SendMessage(hListBox, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)lpEditInfo1);
                            }
                            else
                            {
                                wsprintf(lpEditInfo1, "Error number %d", GetLastError());
                                SendMessage(hListBox, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)lpEditInfo1);
                            }
                        }
                        else
                        {
                            wsprintf(lpEditInfo1, "Error number %d", GetLastError());
                            SendMessage(hListBox, LB_INSERTSTRING, (WPARAM)-1, (LPARAM)lpEditInfo1);
                        }
                    }
                }
                break;
            }
        }
        break;
    case WM_DESTROY:                
        {
            FreeLibrary(hDllInstance);
            PostQuitMessage(0);            
            return 0;
        }
        break;
    }
    return (DefWindowProc(hwnd, msg, wParam, lParam));
}
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nShowCmd)
{
    WNDCLASSEX    windowsclass;                                                        
    HWND        hwnd;
    MSG            msg;                                                                
    windowsclass.cbSize        = sizeof(windowsclass);                                
    windowsclass.style        = CS_VREDRAW | CS_HREDRAW | CS_OWNDC;    
    windowsclass.lpfnWndProc    = MainWinProc;                                        
    windowsclass.cbClsExtra    = 0;                                                
    windowsclass.cbWndExtra    = 0;
    windowsclass.hInstance    = hInstance;                                        
    windowsclass.hIcon        = LoadIcon(NULL, IDI_APPLICATION);    
    windowsclass.hCursor        = LoadCursor(NULL, IDC_ARROW);                        
    windowsclass.hbrBackground    = (HBRUSH)GetStockObject(LTGRAY_BRUSH);    
    windowsclass.lpszMenuName    = NULL;                                                
    windowsclass.lpszClassName    = cName;                                                
    windowsclass.hIconSm    = LoadIcon(NULL, IDI_APPLICATION);    
                
    RegisterClassEx(&windowsclass);
 
    hwnd = CreateWindowEx(WS_EX_OVERLAPPEDWINDOW, 
        cName, 
        wName, 
        WS_OVERLAPPEDWINDOW | WS_VISIBLE, 
        180, 180, 550, 500, 
        NULL, 
        NULL, 
        hInstance, 
        NULL);
    ShowWindow(hwnd, nShowCmd);
    UpdateWindow(hwnd);
    while(GetMessage(&msg, NULL, 0, 0))
    {
        TranslateMessage(&msg);
        DispatchMessage(&msg);
    }
    return(msg.wParam);
}
 
 
Но чего-то не получилось....
 
Кроме этого пробывал загрузить следующим образом: 
 
#include <tchar.h>
#include <windows.h>
 
HINSTANCE H_DLL ;
 
 
H_Vcore=LoadLibrary("DLL.dll");//Загрузка библиотеки
if (H_Vcore)//Если загружена то:
{ ...

Помогите пожалуйста начинающему... Заранее очень благодарен!
Добавлено через 44 секунды
Вот ошибки при использовании вышеуказанного поста:

1>.\Main.cpp(43) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [8]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(56) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'const char [7]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(72) : error C2664: 'LoadLibraryExW' : cannot convert parameter 1 from 'const char [10]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(78) : error C2664: 'lstrcpyW' : cannot convert parameter 1 from 'LPSTR' to 'LPWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(79) : error C2664: 'lstrlenW' : cannot convert parameter 1 from 'LPSTR' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(80) : error C2664: 'wsprintfW' : cannot convert parameter 1 from 'CHAR *' to 'LPWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(85) : error C2664: 'wsprintfW' : cannot convert parameter 1 from 'CHAR *' to 'LPWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(91) : error C2664: 'wsprintfW' : cannot convert parameter 1 from 'CHAR *' to 'LPWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(125) : error C2440: '=' : cannot convert from 'CHAR [13]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(138) : error C2664: 'CreateWindowExW' : cannot convert parameter 2 from 'CHAR [13]' to 'LPCWSTR'
1> Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast
1>.\Main.cpp(146) : warning C4244: 'return' : conversion from 'WPARAM' to 'int', possible loss of data
1>Build log was saved at "file://f:\Мои документы\Visual Studio 2005\Projects\Tempik\Tempik\Debug\B uildLog.htm"
1>Tempik - 10 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
12.06.2009, 09:52
Ответы с готовыми решениями:

Динамическая загрузка dll
Программа использует функции из нескольких dll. Запуск программы в течение дня происходит многократно. С целью ускорения запуска программы...

Динамическая загрузка dll
Пытаюсь сделать так HMODULE hUser32 = LoadLibraryA(&quot;user32.dll&quot;); FARPROC ProcAdd = GetProcAddress(hUser32, &quot;MessageBoxA&quot;); Сейчас как...

Динамическая загрузка DLL
Я написал библиотеку и использую ее в консольном приложении подключая динамически. В конфигурации x64 все работает нормально, а в...

7
 Аватар для Lerikh
14 / 14 / 1
Регистрация: 09.06.2009
Сообщений: 42
12.06.2009, 10:05
либо измени в проекте используемую кодировку с юникодовской на многобайтовую, либо проставь перед каждой "какой-то_текст" символ "L"

Добавлено через 1 минуту 4 секунды
например:

C++
1
LoadLibrary("DLL.dll");
замени на

C++
1
LoadLibrary(L"DLL.dll");
0
0 / 0 / 0
Регистрация: 12.06.2009
Сообщений: 4
12.06.2009, 10:20  [ТС]
А что надо сделать если выскакивают следующие ошибки:

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>F:\Мои документы\Visual Studio 2005\Projects\Tempik\Debug\Tempik.exe : fatal error LNK1120: 1 unresolved externals
0
 Аватар для oxotnik
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
12.06.2009, 10:29
Цитата Сообщение от ImportDLL Посмотреть сообщение
А что надо сделать если выскакивают следующие ошибки:

1>MSVCRTD.lib(crtexew.obj) : error LNK2019: unresolved external symbol _WinMain@16 referenced in function ___tmainCRTStartup
1>F:\Мои документы\Visual Studio 2005\Projects\Tempik\Debug\Tempik.exe : fatal error LNK1120: 1 unresolved externals
тип проекта надо было выбирать Win32 Application, а выбрано было консольное
0
 Аватар для Lerikh
14 / 14 / 1
Регистрация: 09.06.2009
Сообщений: 42
12.06.2009, 10:30
это значит, что ты "используешь неразрешённый внешний идентификатор"

в твоём случае, как я понимаю, компилятор не может найти точку входа, не понимая _WinMain. Кажется в настройках проекта можно изменить и этот параметр. ИЛИ(!) создай новый проект, и перекопируй функции, которые тебе нужны, в него. В main нового проекта скопируй только тело функции
0
0 / 0 / 0
Регистрация: 12.06.2009
Сообщений: 4
12.06.2009, 11:08  [ТС]
Скажите пожалуйста из каких файлов должен состоять проект, а то что-то запутался:

Добавлено через 24 минуты 8 секунд
Какой проект мне надо создать? Пустой или уже с предкомилированными файлами?
0
2343 / 499 / 22
Регистрация: 01.04.2009
Сообщений: 2,200
12.06.2009, 14:12
Цитата Сообщение от ImportDLL Посмотреть сообщение
Какой проект мне надо создать? Пустой или уже с предкомилированными файлами?
да какой хочешь.
главное, сделай его Win32, а не Console Application.
0
5 / 5 / 0
Регистрация: 21.12.2008
Сообщений: 82
13.06.2009, 06:21
Про длл можешь тут прочитать
http://www.rsdn.ru/article/baseserv/dlluse.xml
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.06.2009, 06:21
Помогаю со студенческими работами здесь

Динамическая загрузка DLL
Доброго времени суток! Создал dll с добавление класса, как учили: http://msdn.microsoft.com/ru-ru/library/ms235636.aspx. Далее,...

создание библиотеки dll и динамическая загрузка
Есть какие-нибудь статьи, чтобы изучить, как создать и загрузить библиотеку? А то на сайте msdn.microsoft дают такой код, который с...

Динамическая загрузка ui в приложение
Мне нужно следующее: У меня есть ui файл в файловой системе(xml файл отвечающий за ui) путь к ui файлу у меня передается через аргументы...

Динамическая загрузка библиотеки
lab2.dll #include &lt;windows.h&gt; #include &lt;math.h&gt; extern &quot;C&quot; __declspec(dllexport) double MyFunc(double X, double Y) { return...

Динамическая загрузка формы
Всем привет! Подскажите, можно ли как-то загрузить форму динамически в процессе выполнения программы по ее имени (UnicodeString)? ...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru