Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
#1

dLL - C++

21.02.2011, 23:32. Просмотров 1802. Ответов 20
Метки нет (Все метки)

Мужики, помогите, нигде не могу найти.
есть у меня dLL

вот его cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Главный DLL-файл.
 
#include "stdafx.h"
 
#include "lib.h"
 
extern "C" __declspec(dllexport) void func1() {
    cout << " LOL ";
 
}
 
 
extern "C" __declspec(dllexport) void func2() {
}
хочу вызвать функцию1, но я даж не могу загрузить ее адресс
C++
1
2
3
4
HANDLE hDll;
        FARPROC pDll;
        hDll = LoadLibrary (L"lib.dll");
        pDll = GetProcAddress (hDll, MAKEINTRESOURCE(1));
выдет ошибку
1>menu.cpp(17): error C2664: GetProcAddress: невозможно преобразовать параметр 1 из "HANDLE" в "HMODULE"
1> Для преобразования "void*" к указателю на тип, не являющемуся "void", требуется явное приведение
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.02.2011, 23:32     dLL
Посмотрите здесь:

Загрузка 32 bit DLL в 64 bit DLL - C++
Доброго дня, в своем предыдущем посту я озадачивался вопросом о том, как можно прикрутить DLL файл в проект visual studio, для доступа...

Отсутствует gbs32.dll, fbclient.dll или путь к ним - Firebird/InterBase
Я не смогла зарегистрировать базу, так как мэнеджер запросил указать путь к gbs32.dll или fbclient.dll. Файлы скачала и установила, но...

Не загружается php_ifx.dll, пишет unable to load dinamic library dhpextensionsphp_ifx.dll - PHP
люди добрые, помогите кто чем может.. под виндами, стоит PHP 4.3.4, в php.ini указан extension_dir и естественно соответствующий...

Почему dll quake весит 1мб,плеер юнити-10мб, warcraft.dll-8мб - Windows 8, 8.1
Почему так много весят эти файлы?Ресурсы хранятся в другом месте а там что движок?Но... они что исписали тысячи строк кода для одного мб?

Точка входа в процедуру REGISTER APPLICATION RESTART не найдена в библиотеке DLL KERNEL 32.dll - Ремонт ноутбуков
Ошибка выпадает при загрузке WinXP. Как быть ?

ISDone.dll,Unarc.dll вернул код ошибки 7 - Оперативная память
Всем привет,с наступающим НГ)такая проблема,приобрёл оперативку на 2гб,до этого стояло 3гб,ну обрадовался,вынул 1гб,вставил приобретённую...

Дизассемблирование DLL, правка кода и компиляция его в DLL - .NET
ни разу не писал на c#, не пользовался monodeveloperом. сделано следующее: 1. дизассемблировал библиотеку name.dll, использовал...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
21.02.2011, 23:35     dLL #2
Цитата Сообщение от kRicha Посмотреть сообщение
GetProcAddress: невозможно преобразовать параметр 1 из "HANDLE" в "HMODULE"
прототип GetProcAddress такой:
C
1
2
3
4
FARPROC GetProcAddress(
    HMODULE hModule,    // handle to DLL module  
    LPCSTR lpProcName   // name of function 
   );
т.е. hDll должно быть
C
1
HMODULE hDll;
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
21.02.2011, 23:41  [ТС]     dLL #3
так это что, нужно переобьявлять?

Добавлено через 5 минут
сделал так
pDll = GetProcAddress ((HMODULE)hDll,MAKEINTRESOURCE(1));
теперь пишет
1>menu.cpp(17): error C2664: GetProcAddress: невозможно преобразовать параметр 2 из "LPWSTR" в "LPCSTR"
1> Типы, на которые указывают указатели, не связаны; для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
21.02.2011, 23:44     dLL #4
kRicha, а весь код покажите.
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
21.02.2011, 23:44  [ТС]     dLL #5
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
using namespace std;
 
void (*pFun) ();
 
int main()
{
    int cycle = 1, clav = 0, k = 0;
    while (clav != 13)
    {
        HANDLE hDll;
        FARPROC pDll;
        hDll = LoadLibrary (L"lib.dll");
        pDll = GetProcAddress ((HMODULE)hDll,MAKEINTRESOURCE(1));
        menu:
        system("cls");
        k = (k+4)%4;
        if (k == 0) cout << "Game \t<<" << endl; else cout << "Game" << endl;
        if (k == 1) cout << "Save \t<<" << endl; else cout << "Save" << endl;
        if (k == 2) cout << "Author info <<" << endl; else cout << "Author info" << endl;
        if (k == 3) cout << "Exit \t<<" << endl; else cout << "Exit" << endl;
        clav = _getch();
        if (clav == 224)
        {
            clav = _getch();
            if (clav == 80) k++;
            if (clav == 72) k--;
        }
    }
    system("cls");
    switch (k)
    {
    case 0: cout << "DLL test" << endl;break;
    case 1: cout << "Save submenu" << endl;break;
    case 2:  MessageBox( NULL, TEXT("Aleksej\nCSF-201\nLab 5"), TEXT("Author info"), MB_OK ); goto menu; break;
    case 3: return 0;
    }
    system("pause");
}
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
21.02.2011, 23:49     dLL #6
Цитата Сообщение от kRicha Посмотреть сообщение
C++
1
pDll = GetProcAddress ((HMODULE)hDll,MAKEINTRESOURCE(1));
А какую функцию вы хотите вызывать? Вызывайте по имени:
C++
1
pDll = GetProcAddress ((HMODULE)hDll, L"func1");
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
21.02.2011, 23:51  [ТС]     dLL #7
C++
1
pDll = GetProcAddress ((HMODULE)hDll, "func1");
вот так работает. Спасибо.

Теперь я ее могу вызывать как func1();

или надо еще какие-то махинации?
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
21.02.2011, 23:57     dLL #8
Цитата Сообщение от kRicha Посмотреть сообщение
Теперь я ее могу вызывать как func1();
Нет, вы должны вызывать функцию через указатель, который Вы получили с помощью функции GetProcAddress().
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
22.02.2011, 00:00  [ТС]     dLL #9
можете обьяснить, с очень внятными комментами, как это правильно сделать.
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
22.02.2011, 00:09     dLL #10
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// (этот кусок кода будет где глобальные переменные)
// декларация указателя на функцию, которую будем вызывать
typedef void (*PROCFUNC1)();
 
// теперь, когда вызываем GetProcAddress
PROCFUNC1 lpfnFunc1 = GetProcAddress(hDll, L"func1");
 
if (!lpfnFunc1)
{
    // ошибка получения адреса
    return 0;
}
 
// теперь можно вызывать функцию через указатель
lpfnFunc1();
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
22.02.2011, 00:13  [ТС]     dLL #11
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
using namespace std;
 
typedef void (*pFun)();
 
 
int main()
{
    int cycle = 1, clav = 0, k = 0;
    while (clav != 13)
    {
        HANDLE hDll;
        FARPROC pDll;
        hDll = LoadLibrary (L"lib.dll");
        pFun pDll = GetProcAddress ((HMODULE)hDll, "func1");
        menu:
        system("cls");
        k = (k+4)%4;
        if (k == 0) cout << "Game \t<<" << endl; else cout << "Game" << endl;
        if (k == 1) cout << "Save \t<<" << endl; else cout << "Save" << endl;
        if (k == 2) cout << "Author info <<" << endl; else cout << "Author info" << endl;
        if (k == 3) cout << "Exit \t<<" << endl; else cout << "Exit" << endl;
        clav = _getch();
        if (clav == 224)
        {
            clav = _getch();
            if (clav == 80) k++;
            if (clav == 72) k--;
        }
    }
    system("cls");
    pFun();
    switch (k)
    {
    case 0: cout << "DLL test" << endl;break;
    case 1: cout << "Save submenu" << endl;break;
    case 2:  MessageBox( NULL, TEXT("Aleksej\nCSF-201\nLab 5"), TEXT("Author info"), MB_OK ); goto menu; break;
    case 3: return 0;
    }
    system("pause");
}
вродь все сделал как Вы сказали.

1>menu.cpp(18): error C2373: pDll: переопределение; различные модификаторы типа
1> menu.cpp(16): см. объявление "pDll"
1>menu.cpp(18): error C2440: инициализация: невозможно преобразовать "FARPROC" в "pFun"
1> Для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
22.02.2011, 00:15     dLL #12
Цитата Сообщение от kRicha Посмотреть сообщение
error C2373: pDll: переопределение; различные модификаторы типа
удалите строку 16
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
22.02.2011, 00:17  [ТС]     dLL #13
угу.
C++
1
2
1>menu.cpp(17): error C2440: инициализация: невозможно преобразовать "FARPROC" в "pFun"
1>          Для преобразования требуется reinterpret_cast, приведение в стиле С или приведение в стиле функции
пробовал (FARPROC) перед pFun пишет непредвиденный...
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
22.02.2011, 00:21     dLL #14
замените вызовы функций LoadLibrary() и GetProcessAddress() строки 15 по 18 на данный код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
                HMODULE hDll = LoadLibrary (L"lib.dll");
                if (!hDll)
                {
                    std::count << "Error loading library\n";
                    return 0;
                }
 
                pFun pDll = (pFun) GetProcAddress (hDll, L"func1");
                if (!pDll)
                {
                    std::count << "Error GetProcAddress()\n";
                    return 0;
                }
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
22.02.2011, 00:29  [ТС]     dLL #15
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
#include "stdafx.h"
#include <iostream>
#include <Windows.h>
#include <conio.h>
using namespace std;
 
typedef void (*pFun)();
 
 
int main()
{
    int cycle = 1, clav = 0, k = 0;
    while (clav != 13)
    {
        HMODULE hDll = LoadLibrary (L"lib.dll");
                if (!hDll)
                {
                    cout << "Error loading library\n";
                    return 0;
                }
 
                pFun pDll = (pFun) GetProcAddress (hDll, "func1");
                if (!pDll)
                {
                    cout << "Error GetProcAddress()\n";
                    return 0;
                }
        menu:
        system("cls");
        k = (k+4)%4;
        if (k == 0) cout << "Game \t<<" << endl; else cout << "Game" << endl;
        if (k == 1) cout << "Save \t<<" << endl; else cout << "Save" << endl;
        if (k == 2) cout << "Author info <<" << endl; else cout << "Author info" << endl;
        if (k == 3) cout << "Exit \t<<" << endl; else cout << "Exit" << endl;
        clav = _getch();
        if (clav == 224)
        {
            clav = _getch();
            if (clav == 80) k++;
            if (clav == 72) k--;
        }
    }
    system("cls");
        switch (k)
    {
    case 0: pFun();break;
    case 1: cout << "Save submenu" << endl;break;
    case 2:  MessageBox( NULL, TEXT("Aleksej\nCSF-201\nLab 5"), TEXT("Author info"), MB_OK ); goto menu; break;
    case 3: return 0;
    }
    system("pause");
}
во, скомпилилось, загрузилось. Запускаю, выбираю первый пункт меню (должна выполняться функция из dll) а нифига
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
// Главный DLL-файл.
 
#include "stdafx.h"
 
#include "lib.h"
 
extern "C" __declspec(dllexport) void func1() {
        cout << " LOL ";
 
}
 
 
extern "C" __declspec(dllexport) void func2() {
}
вот мой dll знач должно вывести в консоли "LOL", но почему-то не выводит... где ж ошибка то?
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
22.02.2011, 00:35     dLL #16
Цитата Сообщение от kRicha Посмотреть сообщение
C++
1
case 0: pFun();break;
следует полагает, что вот здесь (стр 46) вы предполагаете, что это вызов функции, но вызывать нужно через указатель, так:
C++
1
case 0: pDll();break;
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
22.02.2011, 00:37  [ТС]     dLL #17
какой ужас(
1>menu.cpp(46): error C3861: pDll: идентификатор не найден
извеняйте за вынос мозга
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
22.02.2011, 00:41     dLL #18
Цитата Сообщение от kRicha Посмотреть сообщение
menu.cpp(46): error C3861: pDll: идентификатор не найден
все верно, pDll видима только внутри операторных скобок while, где определена.

строку 22 замените на
C
1
pDll = (pFun) GetProcAddress (hDll, L"func1");
а между строкам 13 и 12 вставьте:
C
1
pFun pDll = NULL;
kRicha
0 / 0 / 0
Регистрация: 27.01.2011
Сообщений: 118
22.02.2011, 00:45  [ТС]     dLL #19
ура!!!!!!! работает!!!!!!! спасибо Вам огромное!)
для функции два сделать аналогично как было с функцией 1?)


p/s/ а можно у вас как-то будет проконсультироваться? просто огромная дыра в этих адресациях и указателях.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.02.2011, 00:49     dLL
Еще ссылки по теме:

Народ! А кто знает где взять Help по InfoZip библиотекам UnZip32.dll & Zip32.dll? - Обо всем!
Народ! А кто знает где взять Help по InfoZip библиотекам UnZip32.dll &amp; Zip32.dll?

Восстановление dll файлов поврежденных вирусами "точка входа в процедуру _wcsupr_s не найдена в библиотеке dll - Удаление вирусов
точка входа в процедуру _wcsupr_s не найдена в библиотеке dll ntdll.dll вирусы повредили файл библиотек после установки help dll...

Что такое D3DX9sab.dll и DXErr9ab.dll? - DirectX
???

Синий экран, hal.dll и halmacpi.dll - BSOD
Здравствуйте! Прошу строго не судить, но очень нуждаюсь в помощи, посмотрела похожие темы и гуглила, сделала все как написано в инструкции,...

При компиляции DLL-проекта не создается DLL-ка - C++
Добрый день. создал в Visual Studio 2010 проект C+= типа DLL. В файл dllmain.cpp вставил вот такой код: // test.cpp: определяет...


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

Или воспользуйтесь поиском по форуму:
schdub
2940 / 1284 / 238
Регистрация: 19.01.2009
Сообщений: 3,359
Завершенные тесты: 1
22.02.2011, 00:49     dLL #20
Цитата Сообщение от kRicha Посмотреть сообщение
для функции два сделать аналогично как было с функцией 1?)
да, только замечу, что имена переменным неплохо было бы давать по содержательнее

Цитата Сообщение от kRicha Посмотреть сообщение
у вас как-то будет проконсультироваться
всегда пожалуйста
Yandex
Объявления
22.02.2011, 00:49     dLL
Ответ Создать тему
Опции темы

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