Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.50/6: Рейтинг темы: голосов - 6, средняя оценка - 4.50
Эксперт С++
8739 / 4317 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
1

Связь клиента с локальным exe-сервером без регистрации в реестре

28.02.2016, 19:52. Показов 1250. Ответов 1
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
добрый вечер.

есть готовый ATLExeServer,
и консольный клиент.

нужно осуществить взаимодействие между ними без необходимости регистрации в реестре.

сразу скажу, что вариант с регистрацией в реестре - рабочий.

нужно получить аналогичный эффект,
но без необходимости регистрации.


проблема следующая:

в конструкторе/деструкторе com-объекта прописал вывод лога в текстовый файл.
просто, что бы зафиксировать факты:
объект корректно создается, и корректно разрушается.

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

далее запускаю exe клиента.
клиент не может получить доступ к интерфейсу com-объекта сервера.

привожу код клиента:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
// импортирую данные из библиотеки типов
// #import PATH_TO_TYPELIBRARY__ no_namespace
#include "precompiled.h"
 
int _tmain(int argc, _TCHAR* argv[])
{
    (void)argc, argv;
 
    setlocale(LC_ALL,"");
    CoInitializeEx(0, COINIT_MULTITHREADED);
 
    // сервер при запуске регистрирует фабрику своего com-объекта
    // после чего, эта фабрика находится в списке "активных" объектов
    // в диспетчере com-библиотеки
 
    // и любое приложение может запросить эту фабрику
    // нужно лишь указать гуид объекта
    // который эта фабрика должна создавать
 
    IClassFactory* factory = NULL;
    const auto hRe = CoGetClassObject(__uuidof(ATLSimpleObjectSTA), 
        CLSCTX_LOCAL_SERVER, 
        NULL, 
        __uuidof(IClassFactory), 
        (void**)&factory
    );
 
    // в этой точке все хорошо.
    // клиент благополучно заполучил фабрику в пользование
    // теперь нужно создать сам объект
    
    IUnknown* ptr_ = NULL;
    auto hRe2 = factory->CreateInstance(NULL, __uuidof(IUnknown), (void**)&ptr_);
 
    // создание com-объекта проходит отлично.
    // никаких ошибок. интерфейс валидный.
    // в конструкторе com-объекта я вывожу лог в обычный текстовый файл.
    // и по наличию этого файла делаю вывод:
    // конструктор com-объекта действительно отработал
 
    // если сделать ptr_->Release();
    // то в файловом логе, я увижу срабатывание деструктора
    // com-объекта.
 
    // обратите внимание: клиент заполучает фабрику объекта
    // а затем создает сам объект
    // и все это - без необходимости использовать реестр
    // и без необходимости side by side сборки
 
    // проблема в том, что нам не нужен интерфейс IUnknown
    // для работы клиенту нужен интерфейс IATLSimpleObjectSTA
    // в котором определены все необходимые методы
    // ради доступа к которым вся эта затея с локальным сервером и затевалась
 
    IATLSimpleObjectSTAPtr ptr;
    auto hRe3 = ptr_->QueryInterface( __uuidof(IATLSimpleObjectSTA), (void**)&ptr);
 
    // однако, к сожалению это не работает
    // ошибка: hRe3 E_NOINTERFACE No such interface supported.
    // интерфейс IATLSimpleObjectSTA не поддерживается.
 
    ptr_->Release();
 
    CoUninitialize();
    system("pause");
}
есть подозрение, что это как то связанно с proxy/stub

клиент не может общаться с локальным сервером напрямки
но на этом мои предположения заканчиваются.

как заставить клиент подхватывать нужные интерфейсы com-объекта?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2016, 19:52
Ответы с готовыми решениями:

Связь клиента с сервером
Доброго времени суток, уважаемые пользователи форума, прошу поделиться вас опытом и советами со...

OLE без регистрации в реестре
Доброго времени суток. Можно ли использовать OLE без регистрации в реестре?

Как правильно установить связь клиента с сервером при помощи websock?
Всем доброе время суток!!! Помогите пожалуйста разобраться. Необходимо установить связь от...

NET-библиотека в Delphi без регистрации ее в реестре
Всем привет! Хочу использовать библиотеку, написанную на c#, в программе, написанной на Delphi....

1
Модератор
3388 / 2160 / 352
Регистрация: 13.01.2012
Сообщений: 8,378
01.03.2016, 08:43 2
тоже видел такое подозреваю библиотеку типов и маршалинг

Добавлено через 3 минуты
Может не может библиотеку типов нарыть

Добавлено через 9 минут
Точнее может быть так - система видет вашу фабрику но не видет в реестре какие интерфейсы она создаёт поэтому зарубает вызов во время транзита. До сервера квер доходит?

Добавлено через 3 минуты
Хардкор вариант - вернуть вместо ункноун свой интерфейс и тупо кастануть)
0
01.03.2016, 08:43
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
01.03.2016, 08:43
Помогаю со студенческими работами здесь

Cеть с доменом, файл обменником, сервером 1С, атс, фаерволом, локальным сервером сайта
Народ помогите схематично хотябы разобраться как организовать ПАРАВЕЛЬНО сеть с доменом, файл...

Взаимодействие exe64 с dll32. COM объект без регистрации в реестре
добрый вечер. windows7 (или выше), visual studio 2013, c++ есть 64 битное приложение (для...

Обработать файл на стороне клиента, без общения с сервером?
Реально ли это сделать, пользователь выберет файл в браузере, так же на стороне клиента файл...

Синхронизация клиента с сервером, без участия в обработке данных
Суть вопроса такова: есть сетевая игра, в которой все данные обрабатываются сервером, клиент...


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

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru