Перейти к содержимому

Фото
- - - - -

[C++] Написание DLL


  • Вы не можете создать новую тему
  • Please log in to reply
11 ответов в этой теме

#1 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 08 октября 2004 - 18:18

Всем здрасте.
У меня возник вопрос, а есть ли способ экспортировать из DLL не отдельные функции, а целый класс с полями и методами, и если да, то как это сделать (я пишу под VC++ 6.0, проект Win32 Dynamic Link Library (без MFC))?
Заранее спасибо.
  • 0

#2 archi

archi
  • Пользователь
  • 84 сообщений
  • Откуда:Таллин

Отправлено 08 октября 2004 - 19:33

как таковой специальной возможности для эскпорта объектов из DLL, к сожалению, нет. DLL может экспортировать только функции.
Поэтому выход существует следующий, ты экспортируешь функцию, которая создает класс и возвращает указатель на него. Используя .h файл с описанием этого объекта ты можешь работать с классом по указателю. Ну, или reference на него объявить.

P.S. Экспорт классов реализуется средствами COM, но я сомневаюсь, что тебе необходимо такое сложное решение, скорее всего подойдет то, которое я описал первым.

Сообщение изменено: archi (08 октября 2004 - 19:34 )

  • 0

#3 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 09 октября 2004 - 16:04

У меня получилось примерно вот что:
BOOL APIENTRY DllMain( HANDLE  hModule, 
                        DWORD  ul_reason_for_call, 
                        LPVOID   lpReserved
     )
{
	return TRUE;
}

extern "C" __declspec(dllexport) void* MyClassExport(void)
{
  class CMyClass
  {
  public:
    CMyClass()
   {
    a = 1.0f;
    b = 13;
   }

   int MySum(void)
   {
    return (int)(a+b);
   }

  public:
   float	a;
   int b;
  };
	
  CMyClass *TestObj = new CMyClass;
  return TestObj;
}
Но даже если ссылка на объект описана правильно, то как теперь вызвать её в клиенте, т.е. как описать саму переменную в которую объект будет возвращаться? :unsure:
  • 0

#4 archi

archi
  • Пользователь
  • 84 сообщений
  • Откуда:Таллин

Отправлено 10 октября 2004 - 10:07

вынеси описание класса в отдельный файл, например CMyClass.h
Потом include этот файл в DLL и include его в ту прогу, которая будет DLL использовать.
а потом все просто
CMyTest& test = MyClassExport();
test.SomeMethod();
test.someProperty = 1;

Сообщение изменено: archi (10 октября 2004 - 10:07 )

  • 0

#5 dronius

dronius
  • Пользователь
  • 153 сообщений

Отправлено 11 октября 2004 - 12:05

как таковой специальной возможности для эскпорта объектов из DLL, к сожалению, нет. DLL может экспортировать только функции.

Да ладно, нет? А COM как, спрашивается, работает? Ну instance-ы, разумеется экспортировать не получиться, но статический код методов и интерфеса - запросто, через библиотеку импортов (import library).

В самой библиотеке DLL компилируются все классы и помечаются с помощью __declspec(dllexport). В приложении подключаются заголовки, декларирующие классы (точно так же, как COM определяет интерфейсы) и все линкуется вместе с библиотекой импортов.

Можно делать и так, как ты сказал, через фабрику классов, которая сидит внутри DLL.
  • 0

#6 archi

archi
  • Пользователь
  • 84 сообщений
  • Откуда:Таллин

Отправлено 11 октября 2004 - 15:34

да, меня на экспорт инстанса переклинило.
возможно я вопрос не так понял...
  • 0

#7 dronius

dronius
  • Пользователь
  • 153 сообщений

Отправлено 11 октября 2004 - 15:41

Во, ты шаришь, расскажи, пожалуйста, как с подобным делом обстоит в .NET, а если подробнее, то C#? Скажем, если тип выхода в проекте установлен как Class Library, то генерируется DLL. Есть ли существенная разница с C++ и как такую библиотеку использовать
?
  • 0

#8 archi

archi
  • Пользователь
  • 84 сообщений
  • Откуда:Таллин

Отправлено 11 октября 2004 - 18:29

В .NET все точно так же или все совсем по другому, смотря с какой стороны посмотреть. Внутри все очень похоже на COM, поскольку .NET Assembly (та же самая Class Library) имеет manifest, с котором описаны классы. Своего рода type library, если сравнивать с COM.
Снаружи все совсем просто... классы организованы по namespace-ам. Нэймспейсы находятся в этих Class Library. Чтобы использовать какой-то класс из namespace - делается "using <namespace name>", потом с классом делается все, что угодно...
вкратце - так...
  • 0

#9 dronius

dronius
  • Пользователь
  • 153 сообщений

Отправлено 12 октября 2004 - 11:17

Т.е. я правильно понял, что индексом классов, их методов и аттрибутов, содержащихся в assembly, является манифест? Тогда вопрос, как он выглядит и как приложения его импортируют? Т.е. что стоит за строчкой "using <xxx>"?

В COM были определены несколько механизмов доступа к объектам классов. Если я верно помню, in-process (DLL), out-process (EXE server) и DCOM. Каким образом работают assemblies в .NET, как к ним обращается клиент?

Сообщение изменено: dronius (12 октября 2004 - 11:18 )

  • 0

#10 archi

archi
  • Пользователь
  • 84 сообщений
  • Откуда:Таллин

Отправлено 12 октября 2004 - 16:22

Т.е. я правильно понял, что индексом классов, их методов и аттрибутов, содержащихся в assembly, является манифест? Тогда вопрос, как он выглядит и как приложения его импортируют? Т.е. что стоит за строчкой "using <xxx>"?
В COM были определены несколько механизмов доступа к объектам классов. Если я верно помню, in-process (DLL), out-process (EXE server) и DCOM. Каким образом работают assemblies в .NET, как к ним обращается клиент?

Просмотреть сообщение

Да, индексом и описанием является Type Reference Information, которая хранится в manifest. Подробнее можно почитать здесь:
http://msdn.microsof...sofassembly.asp
и здесь
http://msdn.microsof...blymanifest.asp
А вот это место хранит очень много информативных ссылок на так называемую Common Type System, при помощи которой обеспечивается использование классов
http://msdn.microsof...temoverview.asp

А за строчкой "using" стоит команда для .NET Runtime найти Assembly, в которой находится указанный namespace, загрузить ее и прочитать Manifest, обеспечивая таким образом выполняющемуся приложению доступ к классам, которые описаны и имплементированы в этой Assembly.
Я подозреваю, что такой способ является аналогом in-process. Аналогом out-process и DCOM являются средства .NET Remoting, с которыми я, к сожалению, не очень хорошо знаком.
  • 0

#11 dronius

dronius
  • Пользователь
  • 153 сообщений

Отправлено 12 октября 2004 - 22:29

А спасибо однако :)
  • 0

#12 Slash

Slash
  • Пользователь
  • 78 сообщений
  • Откуда:Estonia - Tallinn

Отправлено 14 октября 2004 - 02:22

От меня тоже спасибо, а то фиг знает сколько бы я ещё с этим провозился. ;)
  • 0