Как стать автором
Обновить

Три строки шаманства

Время на прочтение3 мин
Количество просмотров1.3K
Научился делать на одном замечательном сайте как запускать WinWord и вставлять свои строки в документ: http://jmvidal.cse.sc.edu/csce790/PS4/

Что же здесь такого, спросите Вы, ведь технология Microsoft OLE Automation описана достаточно широко и используется уже более 10 лет. А удивительно здесь то, что когда функция DO_WORD была перенесена в другой проект, это приводило к возникновению ошибки, Word просто не хотел стартовать. Это несмотря на тот факт, что проект написан на С++, но, к сожалению, не использует технологию MFC. Почему же ничего не работает, ведь инициализация OLE проходит как указано во всех руководствах? Получается, одного этого недостаточно и нужно дополнительно инициализировать библиотеку MFC. Как же это сделать?

В итоге имеем 2 программы, в первой, которая выполняет роль нашего проекта и представлена в виде исходных текстов ниже, вызов функции DO_WORD происходит сразу из _tWinMain(). Во второй программе, которая была получена по ссылке выше, сначала через MFC создается диалог, и только потом вызывается DO_WORD. Как и следовало ожидать, первая программа отказывается работать, вторая работает нормально.

Тогда вторая программа была подвергнута неописуемому шаманству в отладчике. В итоге первая была доработана и получился код, предлагаемый ниже Вашему вниманию. Всего три строки шаманства приводят к нормальному старту WinWord и полноценной работе.

Файл wordmain.cpp:

#include "stdafx.h"
#include "msword9.h"

void DO_WORD(void) 
{
  AfxOleInit();
  AfxEnableControlContainer();

  //start word
  COleVariant covTrue((short)TRUE),
        covFALSE((short)FALSE),
        covOptional((long)DISP_E_PARAMNOTFOUND,
        VT_ERROR);
  _Application app;
  Documents Docs;
  _Document Doc;
  Selection Select;
  _Font Font;

  Find myFind;

  if (!app.CreateDispatch("Word.Application"))
  {
    AfxMessageBox ("Couldn't start Word");
    return ;//FALSE;
  }

  app.SetVisible(TRUE);

  CString fileName = "C:/MyDocFile.doc";

  Docs = app.GetDocuments();
  Doc = Docs.Add(covOptional,covOptional,covOptional,covOptional);

  Select = app.GetSelection();
  //Get Current font object and change it
  Font = Select.GetFont();
  Font.SetBold(TRUE);
  Font.SetItalic(TRUE);
  Font.SetSize(18);

  Select.TypeText("Hello this is a Word doc.\n");

/*
  Doc.SaveAs(COleVariant(fileName),
    covOptional,covOptional,covOptional,
    covOptional,covOptional,covFALSE,covOptional,
    covOptional,covOptional,covOptional);

  //Doc.Close(covFALSE, covOptional, covOptional);
  app.Quit(covFALSE,covOptional,covOptional);
*/

  AfxOleTerm();
}

extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
	LPTSTR lpCmdLine, int nCmdShow)
{
//Три строки шаманства
    AFX_MODULE_STATE* pModuleState = AfxGetModuleState();
    pModuleState->m_bDLL = 0;
    CWinApp *theApp = new CWinApp;

    DO_WORD();

    delete theApp;
    return 0;
}


Файл компиляции compile.bat подходит как для Visual Studio 2010, так и для старенькой Visual Studio 6.0. В нем мы компилируем два файла, wordmain.cpp который приведен выше, а также msword9.cpp который можно получить, выполнив инструкции по ссылке, а именно нажав Ctrl-W и далее на вкладке Automation нажать кнопку Добавить Новый Класс и далее нужно выбрать файл «C:\Program Files\Microsoft Office\Office\msword9.olb» и выбрать все классы, нажав сначала на первый и, с удержанием Shift, на последний элемент соответствующего списка классов.

Файл компиляции compile.bat:

rem Visual Studio 2010
call "C:\Program Files\Microsoft Visual Studio 10.0\VC\BIN\vcvars32.bat"
rem Visual Studio 6.0
rem call "C:\Program Files\Microsoft Visual Studio\VC98\BIN\vcvars32.bat"

mkdir Release
cl   /nologo /MD /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_MBCS" /Fo".\Release\\" /Fd".\Release\\" /FD /c "wordmain.cpp" "msword9.cpp" 
link /nologo /subsystem:windows /incremental:no /machine:I386 /out:".\Release\wordmain.exe" ".\Release\wordmain.OBJ" ".\Release\msword9.obj"


UPD: Выложил исходные тексты из этого поста, включая msword9.cpp, в файл statja.rar.
Теги:
Хабы:
Всего голосов 7: ↑1 и ↓6-5
Комментарии9

Публикации

Ближайшие события