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

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

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

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

26.10.2012, 00:33. Просмотров 1761. Ответов 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 и так далее.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
26.10.2012, 00:33     Как подключить пользовательскую DLL к приложению
Посмотрите здесь:

Как правильно вызвать пользовательскую ф-цию C++
C++ Как подключить dll к проекту?
Подключить библ. bass.dll C++
C++ Подключить dll к программе
C++ Как подключить библиотеку i7000.dll?
как подключить dll и lib SDL C++
Подключить dll C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kastaneda
Форумчанин
Эксперт С++
4468 / 2830 / 224
Регистрация: 12.12.2009
Сообщений: 7,199
Записей в блоге: 1
Завершенные тесты: 1
28.10.2012, 09:56     Как подключить пользовательскую DLL к приложению #21
Проблема в том, что функция называется MyClass::hw, а ТС пытается ее найти как hw. Я же дал ссылку на аналогичную проблему.
Советую выяснить как она реально называется в DLL. Помнится под виндой это можно посмотреть в Total Commander, там на DLL'ке нажать "просмотр" и будет показана вся инфа о DLL, в т.ч. реальное имя функции. Вот по этому имени ее и надо искать.
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
30.10.2012, 23:03  [ТС]     Как подключить пользовательскую DLL к приложению #22
а портатип записала в dll.h и подключила к dllmain ?
Подключила.

Добавлено через 1 час 17 минут
Спасибо всем. Наконец-то программа работает! Оказывается, надо было писать так:
C++
1
hw=GetProcAddress(hLib, "?hw@@YAXXZ")
Оказывается, так называлась эта функция в скомпилированной DLL. А скажите, по какому принципу формируется это название?
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
30.10.2012, 23:26     Как подключить пользовательскую DLL к приложению #23
Цитата Сообщение от KatyPet Посмотреть сообщение
Оказывается, так называлась эта функция в скомпилированной DLL. А скажите, по какому принципу формируется это название?
то , что вы нашли название функции с помощью какой то программы это не выход из ситуации.
1)Вы что то не верно сделали при написании dll
2)название формируется по принцепу - х...р поймёш и пока , что тебе на это замориваться не надо , лучше сделай нормальную dll с нормальным видимым названием , ты хотя бы открой мою dll , увидеш такой ужас как у тебя ?
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,472
30.10.2012, 23:53     Как подключить пользовательскую DLL к приложению #24
Цитата Сообщение от KatyPet Посмотреть сообщение
"?hw@@YAXXZ"
Цитата Сообщение от KatyPet Посмотреть сообщение
А скажите, по какому принципу формируется это название?
тут заложено имя функции и её параметры
т.е зашифровано это void hw(void)
в отличии от C соглашения где просто бы передалось имя hw, а потом гадай что принимает функция и сколько, без h файла или исходников, только декомпилировать dll

Добавлено через 25 минут
кстати функцию можно грузить не по имени а по ординалу
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
31.10.2012, 20:30  [ТС]     Как подключить пользовательскую DLL к приложению #25
Написала в My.h так:
C++
1
2
3
4
5
6
7
8
#ifdef __cplusplus
extern "C"
{
#endif
__declspec(dllexport) void hw(void);
#ifdef __cplusplus
}
#endif
Работает, теперь имя функции в DLL не искажается.
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
31.10.2012, 22:37     Как подключить пользовательскую DLL к приложению #26
Цитата Сообщение от KatyPet Посмотреть сообщение
Работает, теперь имя функции в DLL не искажается.
Вот это другое дело !!! Молодец !!! Хотя я тебе давал пример dll уже давно , но как говорят на ошибках учится .
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
31.10.2012, 22:53  [ТС]     Как подключить пользовательскую DLL к приложению #27
Теперь хочу написать программу, которая будет использовать не мою DLL, а kernel32.dll.
Вот что написала:
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
#include "stdafx.h"
#include<iostream>
#include<conio.h>
#include<windows.h>
void ( __cdecl *MyBeep)(int freq, int dur);
HMODULE hLib;
int main()
{
    if(!(hLib=LoadLibrary(_T("kernel32.dll"))))
    {
        std::cout<<"LoadLibrary doesn't work\n";
        getch();
        return 0;
    }
    if(!((FARPROC &)MyBeep=GetProcAddress(hLib, "Beep")))
    {
        std::cout<<"GetProcAddress doesn't work\n";
        getch();
        return 0;
    }
    MyBeep(10000,1000);
    std::cout<<"kernel32 used\n";
    getch();
    return 0;
}
Оно работает, бибип звучит, но после этого вылезает такая ошибка: "The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convertation with a function pointer declared with a different calling convertation.".
Перевела в яндексе: "
Значение ESP не была должным образом сохраненные на вызов функции. Это, как правило, результат вызова функции, объявленные с одного вызова convertation с указатель функции, объявленные с другой вызов convertation."
И все равно не поняла, в чем проблема
Игорь с++
433 / 456 / 16
Регистрация: 26.01.2011
Сообщений: 2,032
31.10.2012, 23:36     Как подключить пользовательскую DLL к приложению #28
а вот так -
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
#include <cstdlib>
#include <iostream>
#include <windows.h>
 
using namespace std;
 
int main(int argc, char *argv[])
{
    
    typedef void  (__stdcall *Beep)(int a,int b);
    HINSTANCE kernel;
    Beep  My(NULL);
    
    kernel = LoadLibrary("C:/WINDOWS/system32/kernel32.dll");
 
if(kernel==0){return 0;}
 
My = (Beep) GetProcAddress ( kernel , "Beep" );
 
if(My==0){return 0;}
 
My(500,500);
    
    system("PAUSE");
    return EXIT_SUCCESS;
}
KatyPet
4 / 4 / 0
Регистрация: 26.10.2012
Сообщений: 16
01.11.2012, 01:17  [ТС]     Как подключить пользовательскую DLL к приложению #29
Спасибо!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.11.2012, 08:44     Как подключить пользовательскую DLL к приложению
Еще ссылки по теме:

C++ Не удается подключить к приложению gtest и свою статическую либу VS 2010
Как подключить DLL C++
Подключить к проекту на C++ DLL написанный на C# C++
C++ Как создать файл DLL так, чтобы его можно было подключить к VBA Excel?
Как привязать к консольному приложению иконку? C++

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

Или воспользуйтесь поиском по форуму:
ValeryS
Модератор
6505 / 4971 / 459
Регистрация: 14.02.2011
Сообщений: 16,472
01.11.2012, 08:44     Как подключить пользовательскую DLL к приложению #30
Цитата Сообщение от KatyPet Посмотреть сообщение
после этого вылезает такая ошибка: "The value of ESP was not properly saved across a function call.
я же тебе писал обрати внимание
Цитата Сообщение от ValeryS Посмотреть сообщение
соглашение по вызову __cdec есть еще __stdcall (на самом деле их больше это самые главные)от этого зависит кто чистит стек и как передаются параметры (прочитай про них обязательно неправильное условие роняет программу)
http://msdn.microsoft.com/ru-ru/library/zkwh89ks.aspx
http://msdn.microsoft.com/ru-ru/library/zxk0tw93.aspx
Yandex
Объявления
01.11.2012, 08:44     Как подключить пользовательскую DLL к приложению
Ответ Создать тему
Опции темы

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