OLE в MFC для ламеров

horseman

Интересует какая-нибудь литература по работе с Word&Excel через OLE в Visual C++ (MFC). Все с самого начала для ламеров: типа как открыть word(excel)-файл, как получить доступ к его содержимому, как его сохранить, закрыть и т.д....
У кого что-нибудь есть, поделитесь, пожалуйста
Поскольку сетка у меня жутко глючит, то, если есть возможность, вышлите книжки, пожалуйста, на мыло irinamail.ru.
Буду очень признательна!

peter1dav

Наверное, создаешь OLE объект, а дальше на Visual Basic пишешь

horseman

хм, весьма остроумно
на visualbasic-e как-то в MFC не получается... Даже документация от visual basic-а не подходит. Например, всякие разные константы, которыми можно инициализировать входные параметры для функций, скажем, открытия/сохранения, определенные в VB, не определены в C++, и более того, если попытаться как-то более или менее разумно изменить их имена с учетом регистров, то тоже ничего не выходит Компилятор, понимаешь ли, ругается.
Поэтому я и прошу какую-нибудь толковую книжку по OLE

peter1dav

А Тынденкс не помогает?

horseman

неа, потому как инет все время отваливается, а то, что успеваю найти, не подходит

peter1dav

Тут смотрела?
http://rsdn.ru/

horseman

Нет, не смотрела. Спасибо за ссылку!
Но если у кого-нибудь все же есть книжки, то буду рада, если Вы ими поделитесь

bastii

советую копать в сторону директивы препроцессора #import

horseman

может, кто знает, отчего ворд выдает ошибку "Несовпадение типов" при попытке открыть файл через OLE следующим образом

CApplication app;
app.CreateDispatch("Word.Application");
app.put_Visible(TRUE);
CDocuments docs = app.get_Documents;
COleVariant var_true( (short)1 );
COleVariant var_false( (short)0 );
COleVariant null_str( "" );
docs.Open( COleVariant(filename
var_true, var_true, var_false, null_str, null_str, var_true, null_str, null_str,
COleVariant(short(0 null_str, var_true, null_str,
COleVariant(short(0 var_false, null_str);

То есть сам ворд запускается нормально, а указанный файл не открывается, вместо файла появляется окно с ошибкой

horseman

а че за директива? В смысле, что с ней делать?

kokoc88

У тебя не совпадает тип передаваемого variant'а с типом, который хочет получить ворд. Для простого открытия документа можно использовать такой код:

CApplication cApp;
cApp.CreateDispatch("Word.Application");
COleVariant vOptlong)DISP_E_PARAMNOTFOUND, VT_ERROR);
try
{
CDocuments cDocs = cApp.get_Documents;
CDoc cDoc = cDocs.Open(COleVariant("c:\\mydoc.doc"
vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt, vOpt);
cApp.put_Visible(TRUE);
cApp.Activate;
}
catch(COleException *e)
{
LPVOID lpMsg;
::FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS, NULL, e->m_sc,
MAKELANGID(LANG_NEUTRAL,
SUBLANG_DEFAULTLPTSTR) &lpMsg,
0, NULL);
::MessageBox(NULL, (LPCTSTR)lpMsg, "COM Error",
MB_OK | MB_SETFOREGROUND);
::LocalFree( lpMsg );
cApp.Quit(vOpt, vOpt, vOpt);
e->Delete;
}
catch(COleDispatchException *e)
{
char msg[512];
sprintf(msg, "Run-time error '%d':\n\n%s",
e->m_scError & 0x0000FFFF, e->m_strDescription);
::MessageBox(NULL, msg, "Server Error",
MB_OK | MB_SETFOREGROUND);
cApp.Quit(vOpt, vOpt, vOpt);
e->Delete;
}

Потом добавляй в cDocs.Open нужные параметры по одному пока не найдёшь проблему. В catch{} соотв-но стоят обработчики ошибок - можешь написать свои.

horseman

Большое спасибо! Так работает. Хочу задать уточняющий вопрос. Когда в качестве параметра передается переменная
COleVariant vOptlong)DISP_E_PARAMNOTFOUND, VT_ERROR);
то это означает, что нужно подставить значение по умолчанию? В смысле то значение, которе подставляет VB по умолчанию

kokoc88

Видимо, да, т.к. это означает пустой (empty) параметр.

bastii

в документации надо смотреть, я ей последний раз пользовался лет 5-6 назад
директива рабоает как-то так: в ней ссылаешься на библиотеку типов, напрямую или через progid
при компиляции компилятор генерирует оберточные классы для всех коклассов (или как они там называются по идее этими обертками довольно удобно пользоваться, хотя они вроде не совместимы с MFC и ATL классами (хотя я в этом не уверен).
ИМХО в твое случае это самый правильный способ

horseman

Еще один вопрос. Почему Word-сервер так тормозит?! Моя программа запускает Word.Application, потом открывает в нем один документ, берет его содержимое и закрывает приложение. На эти действия уходит около 5(!) секунд! Как сделать, чтобы он работал побыстрее?

rosali

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

horseman

Ну да, в принципе, логично. Спасибо!
Оставить комментарий
Имя или ник:
Комментарий: