Как Вы создаете COM DLL в Visual Studio 2008?

Я подозреваю, что у вас есть опечатка в каком-то месте, если вы проверите _Layoutlogin .cshtml, есть ли в них пробел, поэтому, если на самом деле ваш файл _Layoutlogin.cshtml, он не найдет его.

8
задан Mark Ingram 21 January 2009 в 14:04
поделиться

3 ответа

Для создания нового ATL проект COM, можно продолжить двигаться следующим образом:

  1. Файл, Проекта / Новый Проекта
  2. Visual C++/ATL/ATL Проект
  3. Настройте его настройки и конец нажатия при выполнении

Вы создали новый dll, но это пусто, для добавления COM-объекта, можно сделать это:

  1. Проектируйте/Добавляйте Класс
  2. Visual C++/ATL/ATL простой объект, добавляет нажатие
  3. Дайте имя, которое Вы хотите (как MyObject), и нажатие заканчивает добавлять его

Если Вы хотите это, объект реализует интерфейс

  1. В представлении класса выбирают класс объекта (CMyObject)
  2. Щелкните правой кнопкой по Интерфейсу/Add/Implement...
  3. Можно выбрать, который реализует Interface
    1. Из .idl файла уже в Ваших файлах проектов
    2. Из .tlb/.dll/.exe, которому встроили библиотеку типов
    3. От объекта, уже зарегистрированного
  4. Когда сделанный конец нажатия

PS: намного легче создать новый проект ATL с тем же именем в другой папке и добавить файлы, которые Вы настроили. Мастер делает несколько задач и создает несколько специализированных файлов.

Для больших проектов, которые являются трудными добавить файл файлом, я делаю то же, но вместо того, чтобы добавить мои файлы к новому проекту я начинаю копировать настройки от новых проектов до старого и добавлять любой дополнительный файл, который мастер создал и заголовки фиксации как stdafx.h для слияния новых настроек.

PPS: Если Вы хотите, чтобы тот Ваш dll поддерживал MFC, вместо того, чтобы выбрать Проект ATL необходимо выбрать MFC/MFC Dll. Когда Вы добавите Простой объект ATL, мастер попросит добавлять поддержку ATL проекту.

11
ответ дан 5 December 2019 в 11:28
поделиться

Необходимо записать функцию под названием DllGetClassObject и экспортировать его. Та функция ответственна за выделение "фабрики классов", которую также необходимо записать, и которая в свою очередь способна к выделению экземпляров COM-объекта. Это должно реализовать IClassFactory.

Не слишком трудно сделать. Альтернатива должна использовать ATL (см. ответ xhantt), который в теории делает это для Вас, но на практике это - реальная путаница. Так или иначе этому удается инкапсулировать сложность COM в уровне абстракции, который еще более сложен. Удача, пытающаяся перемещать объект между DLLs, например.

Но Вы могли запустить мастер ATL только для наблюдения примера того, как объявить DllGetClassObject. Реализация IClassFactory очень легко - всего один метод те новости объект.

Затем необходимо зарегистрировать DLL - т.е. поместить ключи в реестр. regsvr32 инструмент не может сделать этого без дальнейшей справки от Вас. Необходимо записать и экспортировать другую функцию под названием DllRegisterServer, который делает всю тяжелую работу. Все это regsvr32 делает загрузить DLL, искать DllRegisterServer и назовите его.

Снова, ATL имеет способ реализовать это для Вас, но он делает это путем чтения своего рода сценария, полного инструкций по модификации реестра, сохраненных в .rgs файле, который встраивается в ресурсы DLL. При случайном помещении какого-либо вида синтаксической ошибки в этот файл регистрация перестала работать тихо.

Таким образом, снова можно на самом деле найти более простым записать несколько строк кода для тонкой настройки реестра сами. Вот детали.

При использовании C# вместо этого, у Вас не было бы ни одной из этих проблем. Все инкапсулируется очень чисто. Это на самом деле работает намного лучше, чем C++ как инструмент для разработки COM-объектов.

3
ответ дан 5 December 2019 в 11:28
поделиться

При создании решения оно автоматически регистрирует dll. И также это создает два файла _i.c и.h файл.

Для тестирования dll создают приложение приложения:

  1. Создайте демонстрационное приложение Win32. Включайте _i.c и.h в cpp файле win32 приложения, которое имеет основную функцию

  2. Назовите CoInitialize ();

  3. Объявите указатель на интерфейс CComPtr pMyInterface = ПУСТОЙ УКАЗАТЕЛЬ;//, где IMyInterface объявляется в _i.c

  4. Создайте экземпляр pMyInterface. CoCreateInstance (CLSID_MyClass);//CLSID_MyClass является GUID, представляющий
    CoClass

  5. Назовите API существующими в Интерфейсе

  6. Назовите CoUnInitialize ();

1
ответ дан 5 December 2019 в 11:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: