[C++] Написание DLL
#2
Отправлено 08 октября 2004 - 19:33
Поэтому выход существует следующий, ты экспортируешь функцию, которая создает класс и возвращает указатель на него. Используя .h файл с описанием этого объекта ты можешь работать с классом по указателю. Ну, или reference на него объявить.
P.S. Экспорт классов реализуется средствами COM, но я сомневаюсь, что тебе необходимо такое сложное решение, скорее всего подойдет то, которое я описал первым.
Сообщение изменено: archi (08 октября 2004 - 19:34 )
#3
Отправлено 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; }Но даже если ссылка на объект описана правильно, то как теперь вызвать её в клиенте, т.е. как описать саму переменную в которую объект будет возвращаться?
#4
Отправлено 10 октября 2004 - 10:07
Потом include этот файл в DLL и include его в ту прогу, которая будет DLL использовать.
а потом все просто
CMyTest& test = MyClassExport(); test.SomeMethod(); test.someProperty = 1;
Сообщение изменено: archi (10 октября 2004 - 10:07 )
#5
Отправлено 11 октября 2004 - 12:05
Да ладно, нет? А COM как, спрашивается, работает? Ну instance-ы, разумеется экспортировать не получиться, но статический код методов и интерфеса - запросто, через библиотеку импортов (import library).как таковой специальной возможности для эскпорта объектов из DLL, к сожалению, нет. DLL может экспортировать только функции.
В самой библиотеке DLL компилируются все классы и помечаются с помощью __declspec(dllexport). В приложении подключаются заголовки, декларирующие классы (точно так же, как COM определяет интерфейсы) и все линкуется вместе с библиотекой импортов.
Можно делать и так, как ты сказал, через фабрику классов, которая сидит внутри DLL.
#8
Отправлено 11 октября 2004 - 18:29
Снаружи все совсем просто... классы организованы по namespace-ам. Нэймспейсы находятся в этих Class Library. Чтобы использовать какой-то класс из namespace - делается "using <namespace name>", потом с классом делается все, что угодно...
вкратце - так...
#9
Отправлено 12 октября 2004 - 11:17
В COM были определены несколько механизмов доступа к объектам классов. Если я верно помню, in-process (DLL), out-process (EXE server) и DCOM. Каким образом работают assemblies в .NET, как к ним обращается клиент?
Сообщение изменено: dronius (12 октября 2004 - 11:18 )
#10
Отправлено 12 октября 2004 - 16:22
Да, индексом и описанием является Type Reference Information, которая хранится в manifest. Подробнее можно почитать здесь:Т.е. я правильно понял, что индексом классов, их методов и аттрибутов, содержащихся в assembly, является манифест? Тогда вопрос, как он выглядит и как приложения его импортируют? Т.е. что стоит за строчкой "using <xxx>"?
В COM были определены несколько механизмов доступа к объектам классов. Если я верно помню, in-process (DLL), out-process (EXE server) и DCOM. Каким образом работают assemblies в .NET, как к ним обращается клиент?
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, с которыми я, к сожалению, не очень хорошо знаком.