Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
n971030
151 / 98 / 1
Регистрация: 23.01.2010
Сообщений: 1,289
#1

Как создать DLL в VS2010 C++ Динамически подключаемую? - C++

13.04.2012, 21:56. Просмотров 2157. Ответов 9
Метки нет (Все метки)

Подскажите кто знает пробовал тут сам зделать не получилось
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.04.2012, 21:56
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как создать DLL в VS2010 C++ Динамически подключаемую? (C++):

Как создать dll на VS2010? - C++
Добрый день! Уважаемые спец. помогите горю, леплю dll на VS2010 prof.rus для VB6 /

Определение класса в DLL - ипользование вне и динамически - C++
Однажды я уже задавал подобный ворос, ответа так и не получил. В свое время я обошелся без использования классов из DLL, но сейчас вновь...

Можно ли в VS2010 автоматически создать заготовку для ф-ии и класса ? - C++
Можно ли в VS2010 автоматически создать заготовку для ф-ии и класса ? Те. я объявляю прототип, потом нажимаю "сочетание клавиш" и...

Как создать DLL в с++ - C++
Добрый день - вообщем прочитал тут книжку про создание DLL в с++ но не могу ее создать расматриваю такой вариант (динамическое подключение)...

Как создать dll библиотеку - C++
Не могу разобраться как зоздать библиотеку ! Захожу в File->New project->Consol Application Win32-> Ставлю галочку DLL Мне генерится...

Как создать и использовать DLL с ресурсами? - C++
Собственно, как создавать DLL и использовать ее функции - я знаю. А вот как создать библиотеку, которая будет хранить только ресурсы и как...

9
panicwassano
592 / 560 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
13.04.2012, 21:59 #2
а документацию кто будет читать????
http://msdn.microsoft.com/ru-ru/library/ms235636.aspx
1
n971030
151 / 98 / 1
Регистрация: 23.01.2010
Сообщений: 1,289
13.04.2012, 22:08  [ТС] #3
Цитата Сообщение от panicwassano Посмотреть сообщение
а документацию кто будет читать????
http://msdn.microsoft.com/ru-ru/library/ms235636.aspx
а да я это читал но у меня не работает в код:

C
1
2
3
 //в заголовочном файле обьявил:
 
_declspec(dllexport) int  R11(int, int);
в основном файле:

C
1
2
3
4
int R11(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
typedef int (*PAVEL)(int, int);
int _tmain(int argc, _TCHAR* argv[])
{
    //int s = R11(1, 2);
    HINSTANCE hDLL;
    PAVEL* pFUNCTION;
    
    hDLL = LoadLibraryA("mydll.dll");
    
    if (hDLL != NULL)
    {
        pFUNCTION = (PAVEL*) GetProcAddress(hDLL, "R11");
    }
 
        int d = (*pFUNCTION)(1, 2);
    
 
    FreeLibrary(hDLL);
     
    return 0;
}

я больше не чего не делал ну разве что dll кинул в папку с основной прогой и все! Короче весь коды вылетает на функции поления адрес о функции r11 которая в dll как будто ее там нет значение = NULL выходит
0
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
14.04.2012, 02:04 #4
У вашей созданной dll ки должно быть два файла .lib и .dll
Насколько я помню их нужно кинуть к проекту, далее в проекте нужно подключить либу так:
- #pragma comment(lib, "libname.lib");
- в основной программе описать прототипы нужных функции из созданной либы со спецификатором _declspec(dllimport)
0
n971030
151 / 98 / 1
Регистрация: 23.01.2010
Сообщений: 1,289
15.04.2012, 19:55  [ТС] #5
Цитата Сообщение от Whiteha Посмотреть сообщение
У вашей созданной dll ки должно быть два файла .lib и .dll
Насколько я помню их нужно кинуть к проекту, далее в проекте нужно подключить либу так:
- #pragma comment(lib, "libname.lib");
- в основной программе описать прототипы нужных функции из созданной либы со спецификатором _declspec(dllimport)
я с этим вроед разобрался а вот динамическое подключение не как не идет
0
Евгений М.
1036 / 977 / 54
Регистрация: 28.02.2010
Сообщений: 2,829
Завершенные тесты: 2
16.04.2012, 06:12 #6
Цитата Сообщение от Whiteha Посмотреть сообщение
У вашей созданной dll ки должно быть два файла .lib и .dll
Достаточно только .dll.
Без .lib можно. Однако для того чтобы использовать нужную функцию придется ухитряться. Собственно вот примерчик:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <windows.h>
#include <stdio.h>
 
typedef double (*rtcdouble)(double);
 
int main()
{
    HMODULE hModule;
    rtcdouble rtcSin;
    double result;
    
    printf("rtcSin Example\n\n");
 
    hModule=LoadLibrary("msvbvm60.dll");
    rtcSin=(rtcdouble)GetProcAddress(hModule,"rtcSin");
 
    result=rtcSin(1.57);
    printf("Sin(pi/2)=%lf\n", result);
 
    return 0;
}
Добавлено через 19 минут
Цитата Сообщение от n971030 Посмотреть сообщение
в основном файле:
Попробуйте так:
C
1
2
3
4
_declspec(dllexport)  int R11(int x, int y)
{
    return x + y;
}
0
n971030
151 / 98 / 1
Регистрация: 23.01.2010
Сообщений: 1,289
16.04.2012, 16:05  [ТС] #7
Цитата Сообщение от Евгений М. Посмотреть сообщение
[/C]
Добрый вечер еще раз - попробовал по вашему совету не работает и так и сяк, остановился на этом варианте толку нету в чем дело?

C++
1
2
3
4
5
6
7
8
9
10
11
12
  //DLL
 
// mydll.cpp: определяет экспортированные функции для приложения DLL.
//
 
#include "stdafx.h"
#include <windows.h>
 
_declspec(dllexport) int r11(int x, int y)
{
    return x + y;
}

//ФАЙЛ *EXE*

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
// myexe.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
 
typedef int (*Ссылка)(int, int);
 
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hANDL;  
    Ссылка Адрес;
    hANDL = LoadLibraryA("mydll.dll");
    if (hANDL == NULL) 
      return 1; 
 
 
 
    Адрес = (Ссылка) GetProcAddress(hANDL, "r11"); 
    
    if(Адрес == NULL)
        return 1;
 
    int k = Адрес(2, 3);
 
    //printf("Результат данных: " + (char) k);
     
 
    return 0;
}
Ошибка происходит в строке: ... GetProcAddress ....
0
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
16.04.2012, 16:41 #8
Цитата Сообщение от n971030 Посмотреть сообщение
_declspec(dllexport) int r11(int x, int y) { return x + y; }
попробуйте так

C++
1
2
3
4
5
6
7
extern "C"
{
_declspec(dllexport) int r11(int x, int y)
{
    return x + y;
}
}
1
n971030
151 / 98 / 1
Регистрация: 23.01.2010
Сообщений: 1,289
17.04.2012, 20:31  [ТС] #9
Цитата Сообщение от DeadRipper Посмотреть сообщение
попробуйте так

C++
1
2
3
4
5
6
7
extern "C"
{
_declspec(dllexport) int r11(int x, int y)
{
    return x + y;
}
}
Это помогло!! но теперь другая проблемма: я там маленько код подредактировал:

ФАЙЛ DLL
C
1
2
3
4
5
6
7
8
9
10
11
// mydll.cpp: определяет экспортированные функции для приложения DLL.
//
 
#include "stdafx.h"
#include <windows.h>
 
extern "C"
_declspec(dllexport) int r11(int x, int y)
{
    return x + y;
}
фАЙЛ *.EXE*

Изменение в строке: typedef int (WINAPI *Ссылка)(int, int);

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
// myexe.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
 
typedef int (WINAPI *Ссылка)(int, int);
 
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hANDL;  
    Ссылка Адрес;
    hANDL = LoadLibraryA("mydll.dll");
    if (hANDL == NULL) 
    {
      return 1; 
    }
 
 
 
    Адрес = (Ссылка) GetProcAddress(hANDL, "r11"); 
    
    if(Адрес == NULL)
        return 1;
 
    int k = Адрес(2, 3);
 
    //printf("Результат данных: " + (char) k);
     
 
    return 0;
}
после внесеных изменений у меня вылетать стало в строке:
int k = Адрес(2, 3); по сути вроде все правильно сделано а в чем причина не понятно
0
n971030
151 / 98 / 1
Регистрация: 23.01.2010
Сообщений: 1,289
19.04.2012, 22:28  [ТС] #10
Цитата Сообщение от n971030 Посмотреть сообщение
Это помогло!! но теперь другая проблемма: я там маленько код подредактировал:

ФАЙЛ DLL
C
1
2
3
4
5
6
7
8
9
10
11
// mydll.cpp: определяет экспортированные функции для приложения DLL.
//
 
#include "stdafx.h"
#include <windows.h>
 
extern "C"
_declspec(dllexport) int r11(int x, int y)
{
    return x + y;
}
фАЙЛ *.EXE*

Изменение в строке: typedef int (WINAPI *Ссылка)(int, int);

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
// myexe.cpp: определяет точку входа для консольного приложения.
//
 
#include "stdafx.h"
#include <stdio.h>
#include <windows.h>
 
typedef int (WINAPI *Ссылка)(int, int);
 
int _tmain(int argc, _TCHAR* argv[])
{
    HMODULE hANDL;  
    Ссылка Адрес;
    hANDL = LoadLibraryA("mydll.dll");
    if (hANDL == NULL) 
    {
      return 1; 
    }
 
 
 
    Адрес = (Ссылка) GetProcAddress(hANDL, "r11"); 
    
    if(Адрес == NULL)
        return 1;
 
    int k = Адрес(2, 3);
 
    //printf("Результат данных: " + (char) k);
     
 
    return 0;
}
после внесеных изменений у меня вылетать стало в строке:
int k = Адрес(2, 3); по сути вроде все правильно сделано а в чем причина не понятно
Помогите разобраться не понимаю
0
19.04.2012, 22:28
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2012, 22:28
Привет! Вот еще темы с ответами:

Как правильно создать свою DLL ? - C++
как правильно создать свою DLL допустим имеется класс class SystemProcesses { typedef ...

Ошибка с msvcp120d.dll. Как создать Release? - C++
Перенес готовый консольный проект на другой компьютер и при запуске выдает такую ошибку Запуск программы не возможен, так как на...

Как создать файл .dll со значками для приложений? - C++
Здравствуйте, уважаемые программисты! Не могли бы вы мне помочь? Как создать файл .dll со значками для приложений? Чтобы было...

Как в Visual C++ Express создать 64-разрядную нативную DLL? - C++
Нативную - в смысле НЕ .NET. Будет ли требовать msv***.dll, неважно


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

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

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