Научился делать на одном замечательном сайте как запускать 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:
Файл компиляции 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:
UPD: Выложил исходные тексты из этого поста, включая msword9.cpp, в файл statja.rar.

В итоге имеем 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.