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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 16, средняя оценка - 4.88
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,169
13.04.2012, 21:56     Как создать DLL в VS2010 C++ Динамически подключаемую? #1
Подскажите кто знает пробовал тут сам зделать не получилось
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
590 / 558 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
13.04.2012, 21:59     Как создать DLL в VS2010 C++ Динамически подключаемую? #2
а документацию кто будет читать????
http://msdn.microsoft.com/ru-ru/library/ms235636.aspx
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,169
13.04.2012, 22:08  [ТС]     Как создать DLL в VS2010 C++ Динамически подключаемую? #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 выходит
Whiteha
Программист
33 / 33 / 4
Регистрация: 08.07.2011
Сообщений: 190
Записей в блоге: 1
14.04.2012, 02:04     Как создать DLL в VS2010 C++ Динамически подключаемую? #4
У вашей созданной dll ки должно быть два файла .lib и .dll
Насколько я помню их нужно кинуть к проекту, далее в проекте нужно подключить либу так:
- #pragma comment(lib, "libname.lib");
- в основной программе описать прототипы нужных функции из созданной либы со спецификатором _declspec(dllimport)
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,169
15.04.2012, 19:55  [ТС]     Как создать DLL в VS2010 C++ Динамически подключаемую? #5
Цитата Сообщение от Whiteha Посмотреть сообщение
У вашей созданной dll ки должно быть два файла .lib и .dll
Насколько я помню их нужно кинуть к проекту, далее в проекте нужно подключить либу так:
- #pragma comment(lib, "libname.lib");
- в основной программе описать прототипы нужных функции из созданной либы со спецификатором _declspec(dllimport)
я с этим вроед разобрался а вот динамическое подключение не как не идет
Евгений М.
1033 / 974 / 53
Регистрация: 28.02.2010
Сообщений: 2,817
Завершенные тесты: 2
16.04.2012, 06:12     Как создать DLL в VS2010 C++ Динамически подключаемую? #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;
}
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,169
16.04.2012, 16:05  [ТС]     Как создать DLL в VS2010 C++ Динамически подключаемую? #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 ....
DeadRipper
64 / 70 / 3
Регистрация: 25.06.2009
Сообщений: 244
16.04.2012, 16:41     Как создать DLL в VS2010 C++ Динамически подключаемую? #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;
}
}
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,169
17.04.2012, 20:31  [ТС]     Как создать DLL в VS2010 C++ Динамически подключаемую? #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); по сути вроде все правильно сделано а в чем причина не понятно
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
19.04.2012, 22:28     Как создать DLL в VS2010 C++ Динамически подключаемую?
Еще ссылки по теме:

Как правильно создать свою DLL ? C++
Как в Visual C++ Express создать 64-разрядную нативную DLL? C++
C++ Как создать и использовать DLL с ресурсами?

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

Или воспользуйтесь поиском по форуму:
n971030
 Аватар для n971030
163 / 95 / 1
Регистрация: 23.01.2010
Сообщений: 1,169
19.04.2012, 22:28  [ТС]     Как создать DLL в VS2010 C++ Динамически подключаемую? #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); по сути вроде все правильно сделано а в чем причина не понятно
Помогите разобраться не понимаю
Yandex
Объявления
19.04.2012, 22:28     Как создать DLL в VS2010 C++ Динамически подключаемую?
Ответ Создать тему
Опции темы

Текущее время: 20:51. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru