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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.64
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
#1

Как подключить пользовательскую DLL к приложению - C++

26.10.2012, 00:33. Просмотров 1854. Ответов 29
Метки нет (Все метки)

Добрый вечер! Я первый раз пишу dll. Вот ее текст:
My.cpp:
C++
1
2
3
4
5
6
7
#include<iostream>
#include "My.h"
using namespace std;
namespace myspace
{
    void MyClass::hw(void) {cout<<"HelloWorld";}
}
И My.h:
C++
1
2
3
4
5
6
7
8
namespace myspace
{
    class MyClass
    {
    public:
        static __declspec(dllexport) void hw(void);
    };
}
Компилирую в Visual Studio, всё нормально.
А теперь пытаюсь написать программу, которая будет использовать эту dll. Вот здесь проблема. Вот текст этой программы:
UsesDll.cpp:
C++
1
2
3
4
5
6
7
8
9
10
11
12
#include "stdafx.h"
#include "My.h"
#include<iostream>
#include<conio.h>
#pragma comment(lib, "?.lib")
int main()
{
    myspace::MyClass::hw();
    std::cout<<"Dll used\n";
    getch();
    return 0;
}
My.h:
C++
1
2
3
4
5
6
7
8
namespace myspace
{
    class MyClass
    {
    public:
        static __declspec(dllexport) void hw(void);
    };
}
И там еще stafx.h, stdafx.cpp и targetver.h, которые Visual Studio добавило само.
Так вот, эта программа не линкуется - появляется ошибка:
error LNK2019: unresolved external symbol "public: static void __cdecl myspace::MyClass::hw(void)" (?hw@MyClass@myspace@@SAXZZ) referenced in function _main.
Что посоветуете?

Добавлено через 19 минут
Точнее, в пятой строке файла UsesDll.cpp нет никакого pragma и так далее.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 00:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Как подключить пользовательскую DLL к приложению (C++):

Как подключить dll на C# к проекту (dll) на С++ - C++
Подскажите, пожалуйста, как подключить dll на C# к проекту (dll) на С++. В интернете много примеров, где показаны примеры по подключению...

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

Как подключить dll к проекту? - C++
Ребят помогите пожалуйста, если сможете а то я уже 3 дня долбаюсь чет никак не могу разобраться с этими dll. вот я написал код dll-ки ...

как подключить dll и lib SDL - C++
как подключить к проекту(в Visual Studio 2010) библиотеку SDL?// есть SDL.dll, SDL.lib и SDLmain.lib и еще папка с include'ами

Как подключить библиотеку i7000.dll? - C++
у меня есть библиотека i7000.dll библиотека необходимая для работы с com портами все остальное работает нормально а эта работает только с 3...

Не удается подключить к приложению gtest и свою статическую либу VS 2010 - C++
Здравствуйте, господа. Возникла проблема с линкером в VS 2010 после подключения к консольному приложению собственной же статической...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.10.2012, 09:11 #2
Посмотри, может поможет.
1
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
26.10.2012, 11:04  [ТС] #3
Посмотрела тему по ссылке. Теперь код моей программы, использующей DLL, выглядит так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
typedef void (*hw)(void);
#include "stdafx.h"
#include "My.h"
#include<iostream>
#include<conio.h>
int main()
{
    HMODULE hLib=LoadLibrary(LPCWSTR("MyDll.dll"));
    hw func=(hw)GetProcAddress(hLib, "hw");
    func();
    std::cout<<"Dll used\n";
    getch();
    return 0;
}
Теперь программа компилируется и линкуется нормально, но не работает. Она останавливается на месте вызова func() и говорит "Unhandled exception at 0x00000000 in UsesDll.exe: 0xC0000005: Access violation".
0
Kastaneda
Форумчанин
Эксперт С++
4653 / 2862 / 228
Регистрация: 12.12.2009
Сообщений: 7,271
Записей в блоге: 2
Завершенные тесты: 1
26.10.2012, 11:08 #4
Код DLL тоже поменяй.

Добавлено через 1 минуту
C++
1
2
3
4
5
BOOL _stdcall DllMain(HINSTANCE hInst, DWORD Reason, LPVOID reserved){
  if(Reason==DLL_PROCESS_ATTACH)
       hInstance = hInst;
       return true;
}
DllMain обязательная функция.
0
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
26.10.2012, 17:54  [ТС] #5
Поменяла код dll. Теперь он такой: MyDll.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<iostream>
#include "My.h"
#include<windows.h>
using namespace std;
HINSTANCE hInstance=NULL;
namespace myspace
{
    BOOL _stdcall DllMain(HINSTANCE hInst, DWORD Reason, LPVOID reserved)
    {
       if(Reason==DLL_PROCESS_ATTACH)
       {
          hInstance = hInst;
          return true;
        }
    }
    void MyClass::hw(void) {cout<<"HelloWorld";}
}
А все равно при запуске та же ошибка.
Я думаю, проблема не в DLL, а в программе, использующей DLL. Потому что я попробовала ее запустить, не подкладывая DLL рядом с ней в папку, и, вместо того, чтоб вывести сообщение, что требуется такая-то DLL (как это делают нормальные программы), она выдает все ту же ошибку.
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.10.2012, 22:26 #6
есть два метода загрузки dll статитческий и динамический если загружать статически и не класть dll рядом то будет то сообщение о котором ты писала , а вот если динамически и не положить dll , то бог знает , что может произойти , может и вообще не чего , а может и программа провалиться с грохотом, ты уж определись как ты хочеш её загрузить !
0
Croessmah
Эксперт CЭксперт С++
13214 / 7486 / 842
Регистрация: 27.09.2012
Сообщений: 18,403
Записей в блоге: 3
Завершенные тесты: 1
26.10.2012, 22:30 #7
Цитата Сообщение от Игорь с++ Посмотреть сообщение
есть два метода загрузки dll статитческий и динамический если загружать статически и не класть dll рядом то будет то сообщение о котором ты писала , а вот если динамически и не положить dll , то бог знает , что может произойти , может и вообще не чего , а может и программа провалиться с грохотом, ты уж определись как ты хочеш её загрузить !
Само название DLL дает понять, что это должна быть динамическая библиотека
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
26.10.2012, 22:35 #8
Цитата Сообщение от Игорь с++ Посмотреть сообщение
динамический
это LoadLibrary и тогда нужно не класть рядом а прописать путь к dl
если путь не прописать то будет искать в своей папке папке видос и как там пути настроены
и конечно проверять что возвращает функция
C++
1
2
if(!(dasWordl_dll=LoadLibrary("имя библиотеки")))
        return false;// ошибка загрузки делать нечего
Цитата Сообщение от Игорь с++ Посмотреть сообщение
статически и не класть dll рядом
а вот это на этапе компиляции и нужна не Dll а lib, которая так же компилируется при создании Dll
но если в настройках компилятора стоит линковать динамически то Dll тоже нужна и рядом с программой или в системных папках
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.10.2012, 22:58 #9
Цитата Сообщение от Croessmah Посмотреть сообщение
Само название DLL дает понять, что это должна быть динамическая библиотека
название может и даёт понятие , но способа загрузки два !

Цитата Сообщение от ValeryS Посмотреть сообщение
это LoadLibrary и тогда нужно не класть рядом а прописать путь к dl
если путь не прописать то будет искать в своей папке папке видос и как там пути настроены
во первых согласен , что не обязательно , но с другой стороны если не прописать путь и не положить либо рядом либо в системную папку ОС , то интересно посмотреть , что из этого у тебя получится ?
Цитата Сообщение от ValeryS Посмотреть сообщение
а вот это на этапе компиляции и нужна не Dll а lib, которая так же компилируется при создании Dll
я про это и говорил , но нужна она только на этапе компиляции , да и ещё даже если ты и линкуеш статически , то даже и в этом случае не обязательно держать dll в своей папке , её так же можно бросить в системную папку ОС.
0
ValeryS
26.10.2012, 22:59
  #10

Не по теме:

Цитата Сообщение от Игорь с++ Посмотреть сообщение
то интересно посмотреть , что из этого у тебя получится ?
а ничего не получится
правда узнаешь ты об этом на этапе исполнения, компилятор слова не скажет
для этого и нужна проверка

0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.10.2012, 23:01 #11
Цитата Сообщение от ValeryS Посмотреть сообщение
а ничего не получится
для этого и нужна проверка
согласен , но может и прога провалиться
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
26.10.2012, 23:04 #12
Цитата Сообщение от Игорь с++ Посмотреть сообщение
то даже и в этом случае не обязательно держать dll в своей папке , её так же можно бросить в системную папку ОС.
ну а я про что
Цитата Сообщение от ValeryS Посмотреть сообщение
то Dll тоже нужна и рядом с программой или в системных папках
пардон опечатка
читать так
Цитата Сообщение от ValeryS Посмотреть сообщение
то Dll тоже нужна или рядом с программой или в системных папках
Добавлено через 2 минуты
Цитата Сообщение от Игорь с++ Посмотреть сообщение
согласен , но может и прога провалиться
перечитай сообщение я добавил
Цитата Сообщение от ValeryS Посмотреть сообщение
правда узнаешь ты об этом на этапе исполнения, компилятор слова не скажет
а для того чтобы не валилась после проверки или экстренный выход или пиши сообщение пользователю "не могу найти"
0
Игорь с++
436 / 459 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
26.10.2012, 23:05 #13
мы с тобой пробуем объснить друг другу , что и так сами понимаем , а вот ТС когда почитает всё это наверно будет в таком состаянии -
1
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
27.10.2012, 14:06  [ТС] #14
Из всего, что вы написали, я поняла, что хочу сделать динамический метод загрузки. Использую LoadLibrary в коде программы. Не прописываю путь к DLL, но кладу ее в папку рядом с программой. И все равно, при текстах программы и DLL, которые я выложила ранее, программа ломается в момент вызова func. В чем проблема?
0
ValeryS
Модератор
6631 / 5038 / 466
Регистрация: 14.02.2011
Сообщений: 16,847
27.10.2012, 14:24 #15
Я тебе приведу кусок моей проги как работать с dll
C++
1
2
3
4
5
6
7
8
9
10
// объявить глобально чтобы все видели
int( __cdecl*DasWordInit)(char); //указатель на функцию описывается её прототип и соглашение по вызову
 HMODULE dasWordl_dll; // хандлер библиотеки
int init_DasWord()
{
 
    if(!(dasWordl_dll=LoadLibrary(_T("Dasword.dll")))) // загружаем библиотеку
        return 0; // если не загрузилась делать нечего выходим,можно чтото написать пользователю
  if(!((FARPROC &)DasWordInit=GetProcAddress(dasWordl_dll, "DasWordInit")))// загружаем функцию
        return 0;// если не загрузилась делать нечего выходим
и только потом можно вызвать функцию
C++
1
DasWordInit(0);
соглашение по вызову __cdec есть еще __stdcall (на самом деле их больше это самые главные)от этого зависит кто чистит стек и как передаются параметры (прочитай про них обязательно неправильное условие роняет программу)
http://msdn.microsoft.com/ru-ru/library/zkwh89ks.aspx
http://msdn.microsoft.com/ru-ru/library/zxk0tw93.aspx
1
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.10.2012, 14:24
Привет! Вот еще темы с ответами:

Приложению не удалось запуститься, поскольку MSVCR90D.dll не был найден - C++
Приложению не удалось запуститься, поскольку MSVCR90D.dll не был найден. Иногда при отладке возникает данная ошибка. В чем проблема и...

Как создать файл DLL так, чтобы его можно было подключить к VBA Excel? - C++
Пытаясь научиться подключать к VBA хотя бы самую тривиальную функцию на C++. Для примера написал на C++ простую функцию Kvadrat и...

Подключить dll - C++
Здравствуйте. Есть dll, в ней несколько функций, необходимо добавить еще одну, чтобы выводила окно с приветствием. И затем написать win...

Подключить dll к программе - C++
Здравствуйте. Нужна помощь новичку. У меня есть файл, к примеру biblioteka.dll. Каким оброазом можно подключить эту библиотеку к моей...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
27.10.2012, 14:24
Ответ Создать тему
Опции темы

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