
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.206.194.21] |
![]() |
|
Сообщ.
#1
,
|
|
|
Доброе время суток
Прошу не судить строго, я только начинаю знакомится с COM. Конечной целью моего мытарства - GUI WPF - перевести свои исследовательские задачи (хорошо, что я их оформлял в виде классов ![]() Нашел такой ресурс: Введение в COM Создал dll-проект и , по подобию, но ток со своей "начинкой", создал файлы. В результате у меня, еще до компиляции, VS2017 говорит, что она не понимает ни макросов, ни IUnknown... ![]() ![]() Подскажите, как правильно сформировать этот проект. Есть ли еще доходчивые примеры создания сом-ов? |
Сообщ.
#2
,
|
|
|
Доброе время суток
С ресурсов Введение в СОМ и 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 Вроде написало, что изменения в реестре произведены ![]() ![]() Теперь, для проверки, попытаюсь написать клиента: в проект вставил файл интерфейса: ![]() ![]() #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; }; Как только прописал ![]() ![]() ICEathPotential* ps = NULL; HRESULT hrA = CoCreateInstance(CLSID_CEathPotential, NULL, CLSCTX_LOCAL_SERVER, IID_ICEathPotential, (void**)&ps ); сразу выдало: "LNK2001 ... неразрешенные внешние "_CLSID_CEathPotential", "_IID_ICEathPotential". С чем это связано ![]() ![]() |
Сообщ.
#3
,
|
|
|
Доброе время суток
Вопрос с "LNK2001" закрыл ![]() Но почему не регистрируется dll? ![]() ![]() Как корректно необходимо регистрировать сом? |
![]() |
Сообщ.
#4
,
|
|
Если мне не изменяет память, руками редактить реестр плохая идея. Хотя бы из-за недокументированности его структуры в API. Для регистрации COM-серверов есть специальные функции. Что-то типа DllRegisterServer для серверов в DLL. Для EXE не помню. Вообще, там спец.файл есть, через ресурсы обычно используется библиотеками COM.
|
Сообщ.
#5
,
|
|
|
Доброе время суток.
Цитата Qraizer @ ...есть специальные функции. Что-то типа DllRegisterServer для серверов в DLL... Если смотреть на приведенной код CodeProject,то там присутствуют файлы с функциями регистрации. Но если там же посмотреть на код клиента - они не используются! ![]() ![]() ![]() ![]() #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, с текстом выше... ![]() Подскажите пожалуйста, как и где использовать программную регистрацию? |
![]() |
Сообщ.
#6
,
|
|
Цитата _agapa_ @ Подскажите пожалуйста, как и где использовать программную регистрацию? Программная регистрация нужна только если компонент динамический и используется временно, т.е. его долгосрочная регистрация в системе не нужна. Во всех других случаях, регистрацию осуществляет инсталлятор софта или какой-нибудь отдельно-стоящий скрипт. |
Сообщ.
#7
,
|
|
|
Доброе время суток
Цитата B.V. @ Спасибо за инфу Программная регистрация нужна только если... ![]() Цитата B.V. @ А описанный выше reg-файл? ...осуществляет инсталлятор софта или какой-нибудь отдельно-стоящий скрипт Возвращаюсь к своему вопросу: какая может быть причина, что в клиенте, выдает ошибку - объект не зарегистрирован? ![]() ![]() |
Сообщ.
#8
,
|
|
|
Приложение 32 битное? А Windows 32 или 64?
Если 32/64 то регскрипт должен указывать на HKEY_CLASSES_ROOT\WOW6432Node\ и HKEY_CLASSES_ROOT\WOW6432Node\CLSID P.S. Посмотрите в сторону ATL проекта в VS. Многое пишется гораздо проще. Опять же CComPtr, CComQIPtr, CComBSTR сильно облегчают работу с интерфейсами. |
Сообщ.
#9
,
|
|
|
Доброе время суток
Цитата sharky72 @ Приложение 32 битное? А Windows 32 или 64? Windows 64, но приложения сервера и клиента делал 32х битные. И, при регистрации, атрибуты прописались в раздел "HKEY_CLASSES_ROOT", а в раздел "HKEY_CLASSES_ROOT\CLSID" - нет ![]() ![]() Цитата sharky72 @ P.S. Посмотрите в сторону ATL проекта в VS... Посмотрел. ![]() ![]() ![]() Я ток начал знакомство с СОМ. И пример из CodeProject решает все мои начальные задачи. Кроме регистрации... |