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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
#1

Импорт элементов класса в программу - C++

20.09.2009, 05:57. Просмотров 1518. Ответов 23
Метки нет (Все метки)

Имеется созданная библиотека, включающая небольшой класс, как правильно реализовать доступ в программе к элементам данного класса, реализованным в dll.

В приложении-dll имеются, следующие файлы:
stdafx.h
targetver.h
dllmain.cpp-точку входа в dll
вот код VirtualLibraryDLL_beta1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#pragma once
 
class VirtualFuncs
{
    char* sampleName;
public:
    VirtualFuncs(void)
    {
        sampleName="Renault";
    }
 
    virtual ~VirtualFuncs(void)
    {
    }
    char* CALLBACK GetSampleName();
    virtual char* CALLBACK GetVirtSampleName();
};
Вот код VirtualLibraryDLL_beta1.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
#include "stdafx.h"
#include "VirtualLibraryDLL_beta1.h"
 
extern "C" char* CALLBACK VirtualFuncs::GetSampleName()
{
    return this->sampleName;
}
extern "C" char* CALLBACK VirtualFuncs::GetVirtSampleName()
{
    return sampleName;
}
Вот VirtualLibraryDLL.def
LIBRARY "VirtualLibraryDLL_beta1"

EXPORTS
GetSampleName
GetVirtSampleName
Вот само приложение. использующая данный класс. реализованный в 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
26
27
28
29
30
31
32
33
34
35
#include "windows.h"
 
int main()
{
    HMODULE hLib;
    hLib=LoadLibrary(L"VirtualLibraryDLL_beta1.dll");
    if(hLib!=NULL)
    {
        char* (*pGetNameSampleVirt)();
        (FARPROC&)pGetNameSampleVirt=GetProcAddress(hLib, "GetVirtSampleName");
        if(!pGetNameSampleVirt)
        {
            return -2;
        }
        else
        {
            char* strNameVirt=pGetNameSampleVirt();
        }
        char* (*pGetNameSample)();
        (FARPROC&)pGetNameSample=GetProcAddress(hLib, "GetSampleName");
        if(!pGetNameSample)
        {
            return -3;
        }
        else
        {
            char* strName=pGetNameSample();
        }
        FreeLibrary(hLib);
    }//if(hLib!=NULL)
    else
    {
        MessageBox(NULL, L"Невозможно загрузить DLL", L"DLL не найдена", MB_OK);
    }
}
Добавлено через 3 минуты
У меня есть предположение что надо помимо загрузки dll описывать файл-определения класса, а то как реализовать доступ к методом класса без самого объекта.
Или как-то можно описать сам конструктор, создающий объект в def-файле?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.09.2009, 05:57
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Импорт элементов класса в программу (C++):

Создать объявление класса и разработать программу-драйвер, которая продемонстрирует работу класса. - C++
Класс Triangle (треугольник). Класс хранит Декартовы координаты трех углов треугольника. Конструктор принимает три группы координат. Должны...

Составьте программу, выводящую на экран сообщения об отличниках класса, о средней успеваемости учащихся класса - C++
Опишите, используя структуру записи, школьный журнал. Предусмотрите в записи поля для хранения информации о фамилии учащегося, предмете,...

создать программу с использованием класса - C++
Написать программу, в которой используется класс myclass для задания значений "а" для объектов "ob1" и "ob2" и вывода на экран этих...

Переделать программу с использованием шаблона класса - C++
Организовать программу с помощью Шаблона класса. class ttt { char *str; public: ttt(); bool operator >= (ttt...

написать программу с описанием класса Employee - C++
написать программу с описанием класса Employee. Класс должен содержать поля: фамилия, имя, отчество, дата рождения в формате (XX/YY/ZZZZ),...

вектор элементов класса - C++
Подскажите пожалуйста,как сделать вектор элементов класса,особенно .push_back(?)

23
GAV_13
81 / 81 / 4
Регистрация: 14.09.2009
Сообщений: 252
22.09.2009, 12:04 #16
Тогда в чем сложность? в получении декорированного имени? Это можно сделать, воспользовавшись утилитой dumpbin.exe с ключом -exports из состава Visual Studio.
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
22.09.2009, 12:09 #17
Цитата Сообщение от NightmareCode Посмотреть сообщение
Главный мой вопрос теперь по каким правилам декорируется имя линкером?
а на хрена это нужно?
0
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
22.09.2009, 12:17  [ТС] #18
Цитата Сообщение от GAV_13 Посмотреть сообщение
Тогда в чем сложность? в получении декорированного имени? Это можно сделать, воспользовавшись утилитой dumpbin.exe с ключом -exports из состава Visual Studio.
Я пользуюсь другой утилитой, тоже выдает хороший список декорированных имен функций.
Цитата Сообщение от novi4ok Посмотреть сообщение
А зачем тебе это нужно?
Нужно
0
Adler
78 / 78 / 3
Регистрация: 07.05.2009
Сообщений: 316
22.09.2009, 23:53 #19
Цитата Сообщение от GAV_13 Посмотреть сообщение
А буковка L в этой функции зачем? о_О
это злосный макрос от мелкософта в студии. Используется для перевода сторок из ансив в юникод на этапе компиляции.

Добавлено через 1 минуту
тьфу ты тут ещё страница, жаль пост удалить нельзя...
0
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
23.09.2009, 20:39  [ТС] #20
Ну что кто-нибудь знает по каким правилам имя функции искажается линкером очень нужно!!!!
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.09.2009, 01:01 #21
Цитата Сообщение от NightmareCode Посмотреть сообщение
Ну что кто-нибудь знает по каким правилам имя функции искажается линкером очень нужно!!!!
так не понятно, что нужно: то нужно было класс импортировать из длл, который, как я понял, сами же и создаем, теперь углубились в украшение имен, потом переменную назвать будем думать как...

задачу сформулируйте еще раз. полностью, а не какую-то деталь, в которую вы уперлись.
0
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
24.09.2009, 01:09  [ТС] #22
Цитата Сообщение от novi4ok Посмотреть сообщение
Ну что кто-нибудь знает по каким правилам имя функции искажается линкером очень нужно!!!!
Вот основной вопрос!
0
novi4ok
551 / 504 / 8
Регистрация: 23.07.2009
Сообщений: 2,359
Записей в блоге: 1
24.09.2009, 01:17 #23
http://support.microsoft.com/kb/132044/

http://support.microsoft.com/kb/126845

если это поможет.
0
NightmareCode
14 / 7 / 1
Регистрация: 20.09.2009
Сообщений: 89
24.09.2009, 01:35  [ТС] #24
Крайне мало информации в этих топиках о декорировании имен методов и функций линкером.
0
24.09.2009, 01:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.09.2009, 01:35
Привет! Вот еще темы с ответами:

Массив элементов класса - C++
Есть такой Класс class NEURON { private: double *pdInDate; double dOutDate; double *pdWeightIn; int iSumIn; ...

Как переписать программу используя понятие класса - C++
У меня проблемы с написанием программ используя классы. Помогите переписать программу, написанную с использованием Vector в прогу с...

Напишите программу, используя методы класса string - C++
Прошу помочь с простенькой задачей :) 9. Напишите программу, используя методы класса string.

Удаление из массива элементов класса - C++
пытаюсь разобраться с классами, но особо не получается..да и вечное "скорее сдать" не особо оставляет время для того, чтобы понять все до...


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

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

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