Форум программистов, компьютерный форум, киберфорум
C/C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/15: Рейтинг темы: голосов - 15, средняя оценка - 4.80
0 / 0 / 0
Регистрация: 07.07.2015
Сообщений: 10

Как зарегистрировать в реестре сервер как Word.Application, но со своим CLSIDом?

13.01.2016, 16:29. Показов 3199. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день!
Вообще не в теме OLE-серверов скажу сразу. Подскажите как их правильно писать и регистрировать в системе.

Само задание: Надо создать ole-сервер, который будет принимать запрос от приложения на открытие какого-нибудь doc файла через OLE Word (наш ole-сервер зарегистрировать на Word.Application), а сам вызов переделать на открытие через OLE LibreOffice. Просто увидеть как можно правильно реализовать самую первоначальную функцию.

Код на открытие через OLE Word и как он должен быть в OLE LibreOffice есть, но непонятно как правильно написать сам сервер, чтобы одни вызовы заменить на другие.

Подскажите где почитать или может у кого есть просто пример какой-нибудь реализации. Спасибо
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
13.01.2016, 16:29
Ответы с готовыми решениями:

Установка компонентов - как зарегистрировать компоненты вкладки activeX в реестре
Подскажите пожалуйста, как зарегистрировать компоненты вкладки activeX в реестре? Это необходимо, чтобы программа запускалась на других...

Как зарегистрировать новый локальный сервер?
Подскажитн как зарегистрировать новый локальный сервер. в доступных серверах ничего нет.

Word.application: Как Получить Индекс Таблицы?
Добрый день. Делаю небольшой вордовый отчет по шаблону, который собирает данные из коллекции документов. В шаблоне есть поле, на место...

3
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
14.01.2016, 20:20
Не особо понятно что вы имеете ввиду говоря что нужно зарегистрироваться как ворд
0
0 / 0 / 0
Регистрация: 07.07.2015
Сообщений: 10
15.01.2016, 10:10  [ТС]
В самом прямом смысле: зарегистрировать в реестре сервер как Word.Application, но со своим CLSIDом. (но с этой частью я уже разобрался). Остаются только вопросы в правильно реализации функций.

ссылка на msdn - вот пример создания сервера с возможностью регистрации в системе. Скачиваете проект и компилируете. Сформируется dll, которую можно зарегистрировать в системе с помощью функции
Code
1
2
3
Regsvr.exe %Пусть к dll%\CppDllCOMServer.dll
   а  для удаления из системы:
Regsvr.exe /u %Пусть к dll%\CppDllCOMServer.dll
.
Для проверки работоспособности можно написать кусочек кода для вызова метода HelloWorld, который прописан в dll:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
вырезка из диалогового приложения... в контексте просто функции
HRESULT OLEMethod(int nType, VARIANT *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
 
CLSID clsid;
IDispatch*  m_pWAppWord;
    //Инициализация
    m_hr = CLSIDFromProgID(L"CppDllCOMServer.SimpleObject", &clsid);
    if (SUCCEEDED(m_hr))    {
        m_hr = CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (void **)&m_pWApp); 
    }
    VARIANT result;
    VariantInit(&result);
    m_hr = OLEMethod(DISPATCH_METHOD, &result, m_pWApp, L"HelloWorld", 0);
В result будет сообщение, которое в dll вложено
0
Модератор
 Аватар для vxg
3409 / 2180 / 354
Регистрация: 13.01.2012
Сообщений: 8,461
15.01.2016, 14:18
Цитата Сообщение от notmeagain Посмотреть сообщение
зарегистрировать в реестре сервер как Word.Application, но со своим CLSIDом
если речь идет просто о том что бы прикинуться вородом и предоставлять пользователю COM имеющий те же самые методы и так же реагирующий на вызовы, но реально являющийся оберткой над каким-то другим реальным COM то собственно вопрос то в чем? если интерфейс одного объекта точно равен интерфейсу другого, то обертка пусть даже с промежуточной вставкой которая что то там будет делать пока вызов идет по мостику пишется достаточно просто. а вот если интерфейсы разные то ручками ручками все методы делаем. в любом случае вам придется реализовать
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
    //IDispatch
    virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(
        /* [out] */ UINT *pctinfo);
    virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(
        /* [in] */ UINT iTInfo,
        /* [in] */ LCID lcid,
        /* [out] */ ITypeInfo **ppTInfo);
    virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(
        /* [in] */ REFIID riid,
        /* [size_is][in] */ LPOLESTR *rgszNames,
        /* [in] */ UINT cNames,
        /* [in] */ LCID lcid,
        /* [size_is][out] */ DISPID *rgDispId);
    virtual HRESULT STDMETHODCALLTYPE Invoke(
        /* [in] */ DISPID dispIdMember,
        /* [in] */ REFIID riid,
        /* [in] */ LCID lcid,
        /* [in] */ WORD wFlags,
        /* [out][in] */ DISPPARAMS *pDispParams,
        /* [out] */ VARIANT *pVarResult,
        /* [out] */ EXCEPINFO *pExcepInfo,
        /* [out] */ UINT *puArgErr);
как вариант так (тут мы работаем сами с собой через IDispatch, но можно посылать такое и другим объектам я думаю)
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
//------------------------------------------------------------------------------
HRESULT __stdcall CoMyObject::GetTypeInfoCount(
    /* [out] */ UINT *pctinfo)
{
    if (!pctinfo) return E_INVALIDARG;
    *pctinfo = 1;
    return S_OK;
}
//------------------------------------------------------------------------------
HRESULT __stdcall CoMyObject::GetTypeInfo(
    /* [in] */ UINT iTInfo,
    /* [in] */ LCID lcid,
    /* [out] */ ITypeInfo **ppTInfo)
{
    if (iTInfo) return E_INVALIDARG;
    if (!ppTInfo) return E_INVALIDARG;
    ptii->AddRef();
    *ppTInfo = ptii;
    return S_OK;
}
//------------------------------------------------------------------------------
HRESULT __stdcall CoMyObject::GetIDsOfNames(
    /* [in] */ REFIID riid,
    /* [size_is][in] */ LPOLESTR *rgszNames,
    /* [in] */ UINT cNames,
    /* [in] */ LCID lcid,
    /* [size_is][out] */ DISPID *rgDispId)
{
    return DispGetIDsOfNames
    (
        ptii,
        rgszNames,
        cNames,
        rgDispId
    );
}
//------------------------------------------------------------------------------
HRESULT __stdcall CoMyObject::Invoke(
    /* [in] */ DISPID dispIdMember,
    /* [in] */ REFIID riid,
    /* [in] */ LCID lcid,
    /* [in] */ WORD wFlags,
    /* [out][in] */ DISPPARAMS *pDispParams,
    /* [out] */ VARIANT *pVarResult,
    /* [out] */ EXCEPINFO *pExcepInfo,
    /* [out] */ UINT *puArgErr)
{
    return DispInvoke
    (
        static_cast<IDispatch *>(this), //по идее вот тут лежит объект который принимает конкретный вызов метода через IDispatch
        ptii,
        dispIdMember,
        wFlags,
        pDispParams,
        pVarResult,
        pExcepInfo,
        puArgErr
    );
}
естественно ваш объект должен уметь возвращать IDispatch при запросе IDispatch интерфейса через QueryInterface и держать в кармане библиотеку типов для имитируемого интерфейса
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
//------------------------------------------------------------------------------
CoMyObject::CoMyObject(void):
    ptii(0)
{
    server_data_inc_objs_count();
 
    ITypeLib *ptli;
    if
    (
        SUCCEEDED
        (
            LoadRegTypeLib
            (
                TypeLibID,
                TypeLibVersionMajor,
                TypeLibVersionMinor,
                MAKELCID
                (
                    MAKELANGID(LANG_NEUTRAL, SUBLANG_NEUTRAL),
                    SORT_DEFAULT
                ),
                &ptli
            )
        )
    )
    {
        ptli->GetTypeInfoOfGuid(IID_IMyObject, &ptii);
        ptli->Release();
    }
}
//------------------------------------------------------------------------------
CoMyObject::~CoMyObject(void)
{
    server_data_dec_objs_count();
 
    if (ptii) ptii->Release();
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
15.01.2016, 14:18
Помогаю со студенческими работами здесь

Word - как заставить событие у Application работать всегда?
Помогите решить такую проблему, бьюсь уже далеко не первый день. Нужно, чтобы при закрытии: 1) документа; 2) оболочки Word срабатывало...

работа с объектом класса Internetexplorer.application как с Ole-сервер
Привет всем. Подскажите пожалуйста несколько примеров программной работы с OLE-объектом InternetExplorer, а именно: загрузка и сохранение...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru