Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Операционные системы > Софт
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2016, 10:43   #1
notmeagain
Новичок
Джуниор
 
Регистрация: 21.01.2016
Сообщений: 2
Сообщение Замена Word на LibreOffice

Есть к примеру программа, работающая c документами через Word. Документ ложится по какому-то пути, потом открывается через MS Word (с параметрами на чтение или редактирование). Изменение ассоциации файлов (открытие с помощью) не влияет на то, что документы открываются через Word.
Первый вопрос: Можно ли узнать каким способом реализована работа с документами в этой программе: через OLE-сервер запросами или через .NET?

По поводу OLE-серверов

Была написана тестовая программа реализации вызовов OLE Word для открытия документа fname
Код:
CLSIDFromProgID(L"Word.Application", &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_ALL, IID_IDispatch, (void **)&m_pWAppWord);
OLEfunc(DISPATCH_PROPERTYPUT, NULL, m_pWAppWord, L"Visible", 1, x);
OLEfunc(DISPATCH_PROPERTYGET, &result, m_pWAppWord, L"Documents", 0);
OLEfunc(DISPATCH_METHOD, &result, m_pDocumentsWord, L"Open", 1, fname);
Все хорошо отрабатывает, документы открываются через Word

По примеру c MSDN (ссылка) был реализован сервер с дополнительными методом и свойствами, которые необходимы для открытия файла
Код:
[id(4), helpstring("method Open")] HRESULT Open([in] BSTR pRet);
[propget, id(5), helpstring("property Documents")] HRESULT Documents([out, retval] VARIANT* pVal);
[propput, id(6), helpstring("property Visible")] HRESULT Visible([in] VARIANT newVal);
А в методе реализован код для открытия документов через LibreOffice(приведу сокращенный пример):
Код:
CLSIDFromProgID(L"com.sun.star.ServiceManager", &clsid);
CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&m_pWAppLibre);
func(DISPATCH_METHOD, &result, m_pWAppLibre, L"createInstance", 1, path);
m_pDesktopLibre = result.pdispVal;
func(DISPATCH_METHOD, &result, m_pDesktopLibre, L"LoadComponentFromURL", 4, var_array, n_args, blank, filepath);
DLL должна быть зарегистрирована в системе как Word.Application
Код:
RegisterInprocServer(szModule, 
        CLSID_SimpleObject, 
        L"Microsoft.Office.Interop.Word.ApplicationClass", 
        L"Apartment", 
        LIBID_CppDllCOMServerLib, 
        L"Word.Application.0", 
        L"Word.Application");
После компиляции DLL и регистрации ее в системе с помощью cmd и Regsvr32.exe в реестре появляются необходимые нам ветки и тестовая программа все хорошо выполняет: по вызову метода Open OLE Word вызывается метод из OLE LibreOffice и документ открывается в Libre, но в главной программе вообще не работает этот вызов. Может есть где-то ошибка в регистрации dll, при условии что главная программа реализована с вызовами OLE.

Второй вопрос: может что подскажете как все же попытаться подменить OLE Word хотя бы для открытия файлов. И остается вариант реализации через .NET, но к сожалению я не знаю как к нему подступиться. Может тоже кто подскажет)
notmeagain вне форума Ответить с цитированием
Старый 22.01.2016, 14:32   #2
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,442
По умолчанию

Итого:
Вы хотите отделаться малой кровью, не переписывая большой проект завязанный на MS Word, написав OLE-сервер для libre, с аналогичными методами/свойствами и классами и обозвать его как Word?

Чем выражено "вообще не работает"?
Человек_Борща вне форума Ответить с цитированием
Старый 22.01.2016, 15:29   #3
notmeagain
Новичок
Джуниор
 
Регистрация: 21.01.2016
Сообщений: 2
Сообщение

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
Итого:
Вы хотите отделаться малой кровью, не переписывая большой проект завязанный на MS Word, написав OLE-сервер для libre, с аналогичными методами/свойствами и классами и обозвать его как Word?

Чем выражено "вообще не работает"?
По сути верно! Нет возможности переписывать весь большой проект, так как нет исходников его. А завязан он с MS Word только на открытие файла и работа с шаблонами. Если описать в двух словах: написал тестовую программку с вызовами Ole Word(visible, documents, open), написал Ole сервер с реализованными вызовами (put_Visible, get_Documents, Open), в которых я уже реализую вызовы Ol Libre (получаю CLSID com.sun.star.ServiceManager, createInstance к com.sun.star.frame.Frame и вызываю метод LoadComponentFromURL самой Libre). На моей тестовой программе все отрабатывает. На необходимой программе не работает, т.к. я даже не знаю через что там реализована работа: .NET и OLE. И как раз первый вопрос был: как узнать через что и проверить?... просто в программе может быть реализовано через
Код:
 VB если что
oWord = CreateObject("Word.Application")
oWord.Visible = True
oDoc = oWord.Documents.Add("C:\1.docx")
и вылетает ошибка при запуске на ПК, что Create object не удалось создать компонент ActiveX. Теоретически такая же ошибка и в программе, но она ее не отлавливает, а просто не выполняется.

Теоретически описание ошибки есть тут

Последний раз редактировалось notmeagain; 22.01.2016 в 15:32. Причина: дополнение
notmeagain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
LibreOffice ругается на Follow Евгений ГВС Microsoft Office Excel 0 02.11.2011 03:17
Замена в Word'e из Excel'я nikol_ Microsoft Office Excel 2 07.10.2011 12:40
Замена текста в Word Mermaid Помощь студентам 0 10.05.2011 16:50
замена слов в MS Word polov Общие вопросы Delphi 4 09.10.2009 18:29
Word. автоматическая замена значений belikk Microsoft Office Word 8 07.03.2009 11:03