На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела Visual C++ / MFC / WTL (далее Раздела)
1) На Раздел распространяются все Правила Форума.
2) Перед тем, как создать новый топик, убедитесь, что Вы читали Правила создания тем в Разделе.
3) Вопросы, не связанные с программированием (настройки MS Visual Studio, книги, библиотеки и т.д.),
обсуждаются в разделе C/C++: Прочее
4) Вопросы разработки .NET (Windows Form, C++/CLI и т.п.) приложений на Visual C++/C# обсуждаются в разделе .NET.
5) Нарушение Правил может повлечь наказание со стороны модераторов.

Полезные ссылки:
user posted image FAQ Раздела user posted image Обновления для FAQ Раздела user posted image Поиск по Разделу user posted image MSDN Library Online
Модераторы: ElcnU
  
> СOM, с нуля...
    Доброе время суток
    Прошу не судить строго, я только начинаю знакомится с COM. Конечной целью моего мытарства - GUI WPF - перевести свои исследовательские задачи (хорошо, что я их оформлял в виде классов :D ) из консоли.
    Нашел такой ресурс:
    Введение в COM
    Создал dll-проект и , по подобию, но ток со своей "начинкой", создал файлы.
    В результате у меня, еще до компиляции, VS2017 говорит, что она не понимает ни макросов, ни IUnknown...
    :unsure: :unsure:
    Подскажите, как правильно сформировать этот проект.
    Есть ли еще доходчивые примеры создания сом-ов?
      Доброе время суток
      С ресурсов Введение в СОМ и Cdeproject написал компонент.
      Зарегал его reg-файлом:
      REGEDIT
      HKEY_CLASSES_ROOT\EATHMODEL.Component.v001 = Earth potential model
      HKEY_CLASSES_ROOT\EATHMODEL.Component.v001\CurVer = EATHMODEL.Component.v001
      HKEY_CLASSES_ROOT\EATHMODEL.Component.v001\CLSID = {04DA33AD-3035-4FF0-834E-F4805388D736}
      HKEY_CLASSES_ROOT\CLSID\{04DA33AD-3035-4FF0-834E-F4805388D736} = Earth potential model
      HKEY_CLASSES_ROOT\CLSID\{04DA33AD-3035-4FF0-834E-F4805388D736}\ProgID = EATHMODEL.Component.v001
      HKEY_CLASSES_ROOT\CLSID\{04DA33AD-3035-4FF0-834E-F4805388D736}\VersionIndependentProgID = EATHMODEL.Component
      HKEY_CLASSES_ROOT\CLSID\{04DA33AD-3035-4FF0-834E-F4805388D736}\InprocServer32 = D:\COM\Project_1\binCOM\COMServerEarthModel.dll
      HKEY_CLASSES_ROOT\CLSID\{04DA33AD-3035-4FF0-834E-F4805388D736}\NotInsertable

      Вроде написало, что изменения в реестре произведены :unsure: , но в разделе "HKEY_CLASSES_ROOT\CLSID\" я не вижу своего ID :-?

      Теперь, для проверки, попытаюсь написать клиента: в проект вставил файл интерфейса:
      ExpandedWrap disabled
        #pragma once
         
        //#include <Unknwnbase.h>
        #include <ObjBase.h>
         
        // {04DA33AD-3035-4FF0-834E-F4805388D736}
        DEFINE_GUID(IID_ICEathPotential,
                0x4da33ad, 0x3035, 0x4ff0, 0x83, 0x4e, 0xf4, 0x80, 0x53, 0x88, 0xd7, 0x36);
         
        // {AB79F6EF-9E4F-48FC-AE01-7DA7D21D875B}
        DEFINE_GUID(CLSID_CEathPotential,
                0xab79f6ef, 0x9e4f, 0x48fc, 0xae, 0x1, 0x7d, 0xa7, 0xd2, 0x1d, 0x87, 0x5b);
         
        interface ICEathPotential: public IUnknown
        {  
            STDMETHOD ( _InitModel() ) PURE;
            STDMETHOD ( _Potential(double, double, double*) ) PURE;
        };

      Как только прописал
      ExpandedWrap disabled
        ICEathPotential* ps = NULL;
            HRESULT hrA = CoCreateInstance(CLSID_CEathPotential, NULL, CLSCTX_LOCAL_SERVER, IID_ICEathPotential, (void**)&ps );

      сразу выдало: "LNK2001 ... неразрешенные внешние "_CLSID_CEathPotential", "_IID_ICEathPotential".
      С чем это связано :-? :unsure: , подскажите пожалуйста
        Доброе время суток
        Вопрос с "LNK2001" закрыл :D
        Но почему не регистрируется dll? :unsure: :-? (под админом!!!)
        Как корректно необходимо регистрировать сом?
          Если мне не изменяет память, руками редактить реестр плохая идея. Хотя бы из-за недокументированности его структуры в API. Для регистрации COM-серверов есть специальные функции. Что-то типа DllRegisterServer для серверов в DLL. Для EXE не помню. Вообще, там спец.файл есть, через ресурсы обычно используется библиотеками COM.
            Доброе время суток.

            Цитата Qraizer @
            ...есть специальные функции. Что-то типа DllRegisterServer для серверов в DLL...

            Если смотреть на приведенной код CodeProject,то там присутствуют файлы с функциями регистрации. Но если там же посмотреть на код клиента - они не используются! :unsure: :-? :
            ExpandedWrap disabled
              #include "stdafx.h"
              #include "ObjBase.h"
              #include "COM.h"
              #include "../Laba2Com2x/IBVAA.h";
              #include "../Laba2Com2x/IBVAB.h";
               
              int _tmain(int argc, _TCHAR* argv[])
              {
                  double zA = 0, zS = 0, zM = 0, zD = 0, zP = 0, zL = 0;
                  CoInitialize(NULL);
               
                  IBVAA_summer* ps = NULL;
                  HRESULT hrA = CoCreateInstance(CLSID_BVAA, NULL, CLSCTX_INPROC_SERVER, IID_IBVAA_summer, (void**)&ps );
                  
                  if (SUCCEEDED(hrA)) {
                      ps->Add(2,3,zA); printf("ps->Add(2,3,zA) = %4f \n", zA);
                      ps->Sub(16,5, zS); printf("ps->Sub(16,5, zS) = %4f \n", zS);
                      //ps->Release();
                  };
              ...

            А в примере приведен файл register.reg, с текстом выше... :unsure:
            Подскажите пожалуйста, как и где использовать программную регистрацию?
            Сообщение отредактировано: _agapa_ -
              Цитата _agapa_ @
              Подскажите пожалуйста, как и где использовать программную регистрацию?

              Программная регистрация нужна только если компонент динамический и используется временно, т.е. его долгосрочная регистрация в системе не нужна. Во всех других случаях, регистрацию осуществляет инсталлятор софта или какой-нибудь отдельно-стоящий скрипт.
                Доброе время суток
                Цитата B.V. @
                Программная регистрация нужна только если...
                Спасибо за инфу :thanks:

                Цитата B.V. @
                ...осуществляет инсталлятор софта или какой-нибудь отдельно-стоящий скрипт
                А описанный выше reg-файл?
                Возвращаюсь к своему вопросу: какая может быть причина, что в клиенте, выдает ошибку - объект не зарегистрирован? :unsure: Ведь я, перед использованием его, запустил рег-файл :unsure:
                  Приложение 32 битное? А Windows 32 или 64?
                  Если 32/64 то регскрипт должен указывать на HKEY_CLASSES_ROOT\WOW6432Node\ и HKEY_CLASSES_ROOT\WOW6432Node\CLSID

                  P.S. Посмотрите в сторону ATL проекта в VS. Многое пишется гораздо проще. Опять же CComPtr, CComQIPtr, CComBSTR сильно облегчают работу с интерфейсами.
                  Сообщение отредактировано: sharky72 -
                    Доброе время суток
                    Цитата sharky72 @
                    Приложение 32 битное? А Windows 32 или 64?

                    Windows 64, но приложения сервера и клиента делал 32х битные. И, при регистрации, атрибуты прописались в раздел "HKEY_CLASSES_ROOT", а в раздел "HKEY_CLASSES_ROOT\CLSID" - нет :unsure: :-? ....

                    Цитата sharky72 @
                    P.S. Посмотрите в сторону ATL проекта в VS...

                    Посмотрел. :( :wacko: ATL Wisard сгенерировал мне 2 проекта с файлами, на которые я смотрел как "... на новые ворота" :blink:
                    Я ток начал знакомство с СОМ. И пример из CodeProject решает все мои начальные задачи. Кроме регистрации...
                    1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
                    0 пользователей:


                    Рейтинг@Mail.ru
                    [ Script Execution time: 0,0895 ]   [ 15 queries used ]   [ Generated: 15.04.21, 10:30 GMT ]