Как добавить новые функции в COM .dll, созданный проектом Visual Studio C ++ ATL - PullRequest
2 голосов
/ 20 апреля 2011

Я пытаюсь создать очень простую COM-библиотеку DLL для включения в проект C #, чтобы затем использовать ее для включения некоторых функций C ++ в модуль COM для включения в проект C # (язык, используемый в остальной части кодаbase).

Я включил dll COM, добавил класс в dll COM и создал его экземпляр в коде C #, но до сих пор не смог добавить новые функциональные возможности в новый класс.

Вот что я сделал:

  1. Новое приложение Windows Forms для Visual C #
  2. Решение правой кнопкой мыши -> Добавить-> Новый проект ...
  3. ДобавитьНовый проект Visual C ++ ATL (называемый MyCOMDLL)
  4. Параметры по умолчанию, выбранные в мастере проектов ATL (я также пытался установить флажок «Поддержка COM + 1.0»)
  5. Щелкните правой кнопкой мыши проект MyCOMDLL-> Add->Класс
  6. Добавление нового компонента Visual C ++ ATL COM + 1.0
  7. Типизированный «MyCOMObject» в короткое имя, которое автоматически заполняет другие поля на вкладке «Имена»
  8. Оставьте другойнастройки по умолчанию
  9. Встроенныйпроект MyCOMDLL
  10. Добавить ссылку на новый MyCOMDLL.dll в приложение Windows Forms на C #
  11. Щелкните правой кнопкой мыши C # Проект приложения Windows Forms-> Свойства
  12. На вкладке "Сборка" установите для целевой платформы значение x86
  13. Добавить "using MyCOMDLLLib;"в файл Form1.cs
  14. Добавить кнопку в форму и в функции нажатия кнопки добавить

<code>MyCOMDLLLib.MyCOMObjectClass myVariable = new MyCOMObjectClass();

Я пробовал разные вещи, так что выигралне перечислять ничего, кроме самого очевидного здесь - я попытался добавить метод класса в MyCOMObject.h:

// CMyCOMObject
class ATL_NO_VTABLE CMyCOMObject :
    public CComObjectRootEx,
    public CComCoClass,
    public IDispatchImpl
{
public:
    CMyCOMObject()
    {
    }</p>

<pre><code>DECLARE_PROTECT_FINAL_CONSTRUCT()

HRESULT FinalConstruct()
{
    return S_OK;
}

void FinalRelease()
{
}

DECLARE_REGISTRY_RESOURCEID (IDR_MYCOMOBJECT)

DECLARE_NOT_AGGREGATABO * * CMject (CME)

BEGIN_COM_MAP (CMyCOMObject) COM_INTERFACE_ENTRY (IMyCOMObject) COM_INTERFACE_ENTRY (IDispatch) END_COM_MAP ()

// IMyCOMObject public: // SB: Моя попытка добавить новый метод int ReturnT;}};

Метод ReturnTwo был видим в представлении класса CMyCOMObject, но не виден в представлении класса MyCOMObjectClass в проекте C # Windows Forms Application.

Любая помощь высоко ценится.

Ответы [ 2 ]

2 голосов
/ 21 апреля 2011

Я попытался добавить метод класса в MyCOMObject.h

Этого недостаточно. Супер важным файлом в вашем проекте является файл .idl (Язык описания интерфейса). Этот файл генерирует библиотеку типов, которая встраивается в DLL. Библиотека типов - это то, что .NET использует для создания управляемой библиотеки импорта. Ваша добавленная функция не будет там, потому что вы не изменили файл .idl.

Изменение интерфейсов является болезненным, если вы делаете это вручную, есть три места, которые необходимо редактировать. .Idl, .h и .cpp файл. Лучше всего это сделать с помощью мастера. В окне Class View щелкните правой кнопкой мыши интерфейс (например, IFoo), Add, Add Method (или Property). Затем переключитесь на файл .cpp, чтобы написать реализацию метода.

0 голосов
/ 20 апреля 2011

Вы снова скопировали свою новую сборку dll в проект C #?

...