Компьютерный форум
Правила
Вернуться   Компьютерный форум > Форум программистов > Программирование под Windows > Visual C++
Перезагрузить страницу DLL и классы
Ответ
 
Опции темы Опции просмотра
  (#1 (permalink)) Старый
St@lker St@lker вне форума
Member
 
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.10.2003
По умолчанию DLL и классы - 13.02.2004, 01:13

Как мне написать DEF файл чтобы экспортировать функции класса в стиле С? или лучше оставить стиль С++?
Ответить с цитированием
  (#2 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 13.02.2004, 14:59

Посмотрите на эту тему http://www.programme.ru/archive/2001/7/072...72001_1_1.phtml
Там, ближе к концу статьи с подзаголовком "«Мангл» и как его побороть"
Ответить с цитированием
  (#3 (permalink)) Старый
St@lker St@lker вне форума
Member
 
Сообщений: 60
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 16.10.2003
По умолчанию 14.02.2004, 02:37

А чевой-то ссылка не пашет?
Ответить с цитированием
  (#4 (permalink)) Старый
Shunix Shunix вне форума
Member
 
Сообщений: 1,355
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 07.06.2002
По умолчанию 15.02.2004, 22:56

Ссылка может не работать, потому что, к Великому сожалению, журнал "Программист" уже давно стал умирающим зверем - это агония. По-другому, назвать это нельзя!

Что касается вопроса? Что есть "экспорт классов в стиле C"?
Если тебе нужно просто избавиться от декорирования, то можно использовать что-то вроде:
Код:
#pragma comment(linker, "/export:CSummatorConstructor=??0CSummator@@QAE@H@Z")
При этом следует понимать, что про неявную загрузку при этом можно и не вспоминать!

Если ты про extern "C", то вопрос, очевидно, поставлен некорректно, потому что в C нет (явного) понятия класса!
Ответить с цитированием
  (#5 (permalink)) Старый
Vladimir the Red Sunny Vladimir the Red Sunny вне форума
Member
 
Сообщений: 4,232
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Регистрация: 15.05.2003
По умолчанию 16.02.2004, 15:21

Зацытирую....
Цитата:
«Мангл» и как его побороть
Искажение функций C++ компилятором называется по-английски «mangle», и среди русскоязычных программистов широко распространена его калька – «манглить». В принципе «манглеж» функций не препятствует их явному вызову посредством GetProcAddress – достаточно лишь знать, как точно называется та или иная функция, что нетрудно выяснить тем же dumpbin. Однако, засорение программы подобными «заученными» именами выглядит не очень-то красиво; к тому же – всякий компилятор «манглит» имена по-своему, и непосредственное использование имен приводит к непереносимости программы.
Существует способ обойти искажение имен – для этого необходимо подключить к линкеру специальный DEF-файл, перечисляющий имена, которые не должны измениться. В нашем случае он должен выглядеть так

// DllClass.def:
EXPORTS
Demo

Сперва идет ключевое слово EXPORTS, за которым следуют одно или несколько «неприкасаемых» имен. Каждое имя начинается с новой строки, и в его конце не указывается точка с запятой.
Для подключения DEF-файла при компиляции из командной строки – используйте опцию /link /DEF:имя_файла.def, например так: cl DLLclass.cpp /LD /link /DEF:DLLClass.def.
Для подключения DEF-файла в интегрированной среде Microsoft Visual Studio – перейдите к закладке File View окна Workspace и, щелкнув правой клавишей по папке Source Files, выберите в контекстом меню пункт Add Files to Folder, а затем укажите путь к DEF-файлу. Откомпилируйте проект как обычно: Build а Build.

Заглянув в таблицу импорта полученного DLL-файла, мы, среди прочей информации, увидим следующее:

1 0 00001000 ??4MyDllClass@@QAEAAV0@ABV0@@Z
2 1 00001020 Demo

Теперь имя функции Demo выглядит «как положено». А абракадабра, расположенная строчкой выше – это конструктор класса MyDllClass, который, хоть и не был специально объявлен, все равно экспортируется из динамической библиотеки.

Однако, избавившись от одной проблемы, мы получаем другую – имя функции Demo потеряло всякое представление о классе, которому оно принадлежало; и теперь придется загружать его вручную, повторяя эту операцию для каждого элемента класса. Фактически – придется в вызываемой программе собирать «скелет» класса из «косточек» заново. Но иного способа явной загрузки класса из DLL не существует.

Следующий пример демонстрирует вызов функции MyDllClass из динамической библиотеки с явной компоновкой. Обработка ошибок для упрощения опущена. Обратите внимание, как объявляется функция Demo – описания класса в DLL и в вызывающей программе существенно отличаются, поэтому с идеей поместить описания класса в общий для всех include-файл придется расстаться.

// DeMangle.cpp
#include <windows.h>

class MyDllClass{
public:
void (*Demo) (char *str);
};

main()
{
HINSTANCE h=LoadLibrary("DllClass.dll");
MyDllClass zzz;

// Внимание! Выполнение конструктора / деструктора класса
// при явной загрузке не происходит автоматически
// и при необходимости эту операцию следует выполнить вручную
zzz.Demo=(void (*) (char *str)) GetProcAddress(h,"Demo");
zzz.Demo("Test");
}
Ответить с цитированием
Ads.
Ads
Ответ

Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Trackbacks are Вкл.
Pingbacks are Вкл.
Refbacks are Выкл.


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
абстрактные базовые классы Good1984))) С/С++ 5 26.12.2011 15:45
Как создавать классы в С++ Buiilder caxaromires C++ Builder 4 13.04.2011 13:31
Как переделать в классы программный код duden Вопросы начинающих программистов 3 01.06.2010 19:07
Классы модификация магнитофона elenSV С/С++ 2 01.05.2009 17:11
Классы как найти ошибку Виталик 1 Delphi 2 29.01.2009 16:49
Классы-контейнеры как их реализовывать Flik С/С++ 3 21.11.2007 16:38
Производные классы окружности wert С/С++ 1 02.03.2007 23:44
Сервер клиент и классы Gansss C++ Builder 3 02.01.2007 06:31
Классы как с ними работать Klose Delphi 7 31.05.2006 17:45
Классы на Asm как их создавать no_NaMe Assembler 4 13.04.2006 18:18
Классы и компоненты в Builder imported_Des C++ Builder 1 14.08.2005 21:55



Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.
Нardforum.ru - компьютерный форум и программирование, форум программистов