Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.50/18: Рейтинг темы: голосов - 18, средняя оценка - 4.50
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232

Не работает CoCreateInstance

08.12.2020, 01:08. Показов 4384. Ответов 32
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Не могу создать объект класса через CoCreateInstance.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
HRESULT hResult; CLSID clsidSrv;
    /* Получаем идентификатор библиотеки */
    hResult = ::CLSIDFromProgID(L"SERV", &clsidSrv); //Идентификатор  удаётся взять
    if (FAILED(hResult))
    {
        ::MessageBox(NULL, L"CLSIDFromProgID error", L"Error", MB_OK);
        return FALSE;
    }
 
    /* Загружаем библиотеку и получаем указатель на IUnknown */
    hResult = ::CoCreateInstance(clsidSrv, GetControllingUnknown(), CLSCTX_INPROC_SERVER, IID_IUnknown,  (void**)&m_pIUnknown); //Эта команда уже не проходит
    if (FAILED(hResult))
    {
        m_pIUnknown = NULL;
        ::MessageBox(NULL, L"CoCreateInstance error", L"Error", MB_OK);
        return FALSE;
    }
Может подскажите в чём проблема?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
08.12.2020, 01:08
Ответы с готовыми решениями:

CoCreateInstance первый аргумент - unresolved external symbol
HRESULT hr; hr = CoCreateInstanse(CLSID_TAPI, ....error LNK2001: unresolved external symbol _CLSID_TAPI где копать???

CoCreateInstance не создаёт экземпляр объекта
Здравия желаю. По примеру из мсдн написал следующий код: #include "stdafx.h" #include <conio.h> using namespace std; ...

CoCreateInstance()
Здравствуйте. В данный момент изучаю Winapi. Реализовываю простой текстовый редактор. Столкнулся со следующей проблемой. Она проявляется...

32
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.12.2020, 11:42
Студворк — интернет-сервис помощи студентам
Там надо проект создать MFC Library, а объекты добавлять ATL object
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 12:04  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Там надо проект создать MFC Library, а объекты добавлять ATL object
В методичке ничего про это не сказано, там только про эти проекты (про которые я сказал) нужно создать.
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 12:30  [ТС]
oleg-m1973, я сейчас проверил реестр, пришёл к тому, что dll не регистрируется ищу их в \HKEY_CLASSES_ROOT\CLSID\ по идентификатору, но их там нет.
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 12:31  [ТС]
Может быть в этом проблема?
Там просто сказано в методе:
Соберите проект (меню Build и затем пункт Build или F7) и зарегистрируйте
получившийся dll файл с помощью утилиты regsvr32. Это можно сделать прямо из Visual C++,
из меню Tools / Register Controls.


но Register Controls во вкладке tools я не нашёл, поэтому через командную строку (от имени администратора) регистрировал командой:
regsvr32 [путь к dll]\[название dll].dll
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.12.2020, 12:33
Цитата Сообщение от KopHack Посмотреть сообщение
Может быть в этом проблема?
У тебя в проекте вроде должен быть reg-файл, в котором должны быть прописаны все значения реестра
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 12:45  [ТС]
Высветилось сообщение что всё хорошо, но как я прочитал в интернете, что не всегда можно верить тому какое сообщение возвращает эта утилита
0
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 12:53  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
У тебя в проекте вроде должен быть reg-файл, в котором должны быть прописаны все значения реестра
Есть такой в клиенте:

Только там нет таких индетификаторов, которые я указывал когда создавал COM
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
09.12.2020, 12:57
Цитата Сообщение от KopHack Посмотреть сообщение
Или может быть какая проблема с регистрацией dll? Я для этого использовал утилиту regsvr32. Она вроде как в реестр должна записать что-то только я не нашёл.
У меня ваша DLL успешно зарегистрировалась. При выполнении CoCreateInstance DLL успешно подгружается в процесс клиента, вызывается функция DllGetClassObject, а вот она уже не может создать нужный объект. При этом конструктор CCOM_Server даже не вызывается, где-то до него что-то не сраслось.
C++
1
2
3
4
5
STDAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
    AFX_MANAGE_STATE(AfxGetStaticModuleState());
    return AfxDllGetClassObject(rclsid, riid, ppv); // вот это вызывается внутри сервера, но возвращает ошибку
}
Я не знаком с MFC реализацией COM. Похоже, что серверному проекту чего-то не хватает, но чего не знаю. Подозрение вызывает пустой IDL-файл, возможно там что-то должно быть прописано. Если будет время, то посмотрю ещё. Если сами раньше найдёте решение, то напишите что-нибудь в теме, пожалуйста.

Пока искал что-нибудь по теме, нашёл несколько примеров от microsoft (Примеры MFC OLE). Самый простой пример сервера InProc, очень похож на ваш, но функции добавлены через dispatch, а не через отдельный интерфейс. Пример ACDual вроде как должен демонстрировать подключение интерфейсов, ноя не успел толком покопаться в нём.
0
6772 / 4565 / 1844
Регистрация: 07.05.2019
Сообщений: 13,726
09.12.2020, 16:10
Цитата Сообщение от KopHack Посмотреть сообщение
Только там нет таких индетификаторов, которые я указывал когда создавал COM
Ты видишь, там написано MFC_Client.EXE? Этого не должно быть ни при каких условиях. Ты что-то там криво насоздавал, по методичке, подозреваю, тоже древней и кривой.

Добавлено через 1 минуту
Хотя, это же клиент. Файл должен быть в серверной части, в dll. Возможно .rgs
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
09.12.2020, 16:38
Лучший ответ Сообщение было отмечено KopHack как решение

Решение

вызывается функция DllGetClassObject, а вот она уже не может создать нужный объект
Вот тут я напутал. Она успешно создаёт, но запрашивают у неё фабрику, а не сам объект. Фабрика к объекту создаётся, а фабрика уже не может создать объект, так как у объекта нет нужной функции динамического создания. Эта функция прописывается двумя макросома: один в определении класса, другой в реализации.

KopHack, замените в описании класса один макрос на другой:
C++
1
2
    //DECLARE_DYNAMIC(CCOM_Server)
    DECLARE_DYNCREATE(CCOM_Server)
Аналогично для реализации класса:
C++
1
2
//IMPLEMENT_DYNAMIC(CCOM_Server, CCmdTarget)
IMPLEMENT_DYNCREATE(CCOM_Server, CCmdTarget)
1
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 16:46  [ТС]
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Ты видишь, там написано MFC_Client.EXE? Этого не должно быть ни при каких условиях. Ты что-то там криво насоздавал, по методичке, подозреваю, тоже древней и кривой.
Не понял, у меня два проекта один DLL другой exe, из dll мне нужно использовать интерфейс в exe

Добавлено через 7 минут
Цитата Сообщение от Ygg Посмотреть сообщение
KopHack, замените в описании класса один макрос на другой:
не помогло
0
2737 / 894 / 331
Регистрация: 10.02.2018
Сообщений: 2,136
09.12.2020, 16:51
Цитата Сообщение от KopHack Посмотреть сообщение
не помогло
Пробуйте ещё, у меня создание объекта из клиента заработало.
Возможно вы не скомпилировали DLL после изменений или зарегистрировали DLL по другому пути, тогда после компиляции её нужно переложить в место регистрации или перерегистрировать по пути компиляции.
1
2 / 2 / 0
Регистрация: 21.10.2019
Сообщений: 232
09.12.2020, 16:56  [ТС]
Ygg, Да, я её не зарегистрировал

Добавлено через 24 секунды
Ygg, Большое при большое спасибо!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
09.12.2020, 16:56

Com - сервер: Ни CoInitialize(NULL), ни CoCreateInstance(...) не видны
Привет всем. Изучаю книгу Роджерсона Основы Com. Там создается простейший интерфейс: #include <InitGuid.h> interface IX :...

Как правильно уничтожить объект созданный CoCreateInstance?
Недавно поднял SpeechAPI 4 по примеру из книжки "MS Agent и Speech API в Delphi" для активации скриптов голосовыми командами. Там при...

Транслируются ли аргументы функции CoCreateInstance в аргументы функции DllGetClassObject?
НУ то есть я думаю должно быть понятно, о чём речь. В клиенте вызывается функция: CoCreateInstance ( REFCLSID, аргумент__2, ...

Приложение работает в Debug, странно работает в Release и не работает при билде
Действия выполняются на эмуляторе Pixel 2. Android 9.0. Если я запускаю приложение с конфигурацией Debug, то всё в порядке. При запуске же...

Не работает SATA винт при загрузке ПК, а DVD без винта работает. На другом компе этот же винт работает
Здравствуйте. В системный блоке нем при загрузки Биос пишет: Advanced primary master HDD марка жесткого диска has been detected ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
33
Ответ Создать тему
Новые блоги и статьи
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
Hyper-V: Компьютер должен поддерживать доверенный платформенный модуль 2.0.
Maks 31.08.2026
При установке Windows 11 на виртуальную машину Hyper-V 2-го поколения вылезла такая ошибка: Решение: в параметрах виртуальной машины, в разделе "Безопасность" (Security) активировать флаг. . .
Архитектура биовида Стива в Майнкрафте: Зачем бонобо кубический каннибализм
anaschu 30.08.2026
Кубический Вагинокапитализм в Minecraft: Математический инвариант ОДУ и рок Стивов-бонобо Главная задача разработанной «Модели Всего» — наглядно продемонстрировать наличие системной «судьбы». . .
Оттачиваю умение писать js программы.
russiannick 30.08.2026
Проектом выходного дня стало написание Книги шифров Виженера. Итогом стала версия 200, синий туман. Синий туман назван так, потому что замораживает текст под собой. Нажатие синих кнопок управляют. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru