C/C++

Управление Word из С++ BUILDER 6

Дали задание в институте научиться управлять MS Word из С++ BUILDER 6 с использованием COM технологии. Может у кого есть примеры по созданию такой программы.

Находите библитотеку типов ворда - ее и использовать.

Цитата:
Сообщение от незарегистрированный
Дали задание в институте научиться управлять MS Word из С++ BUILDER 6 с использованием COM технологии. Может у кого есть примеры по созданию такой программы.


А мне дали задание написать программу снятия и установки кодовой защиты для документов MS Word. У меня такие вопросы:
Что понимать под кодовой защитой (установка пароля на открытие и (или) на запись; или же шифрование документа по криптоалгоритму)? (препод в отпуске спросить не у кого?)
Что со всем этим делать (идей полно, а начать не могу). Потому что они расплывчатые.
И еще более конкретный вопрос:
Свойство FileName диалога OpenDialog (для выбора файла) хранит путь и имя файла в Ansi String.
Функция StgIsStorageFile(wсhar_t *) для определения является ли файл структурированным хранилищем (коим является Word-документ) требует параметр типа wсhar_t *. Что надо сделать и как, чтобы передать имя выбранного файла с помощью диалога в эту функцию.
Следующее не помогло:
void *uk;
wchar_t *wh;
ukvoid*)(&S);
whwchar_t*)uk;
LONG l = StgIsStorageFile(wh);
какой бы я файл не выбирал функция возвращает одно и тоже значение (File not found).

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

Цитата:
Сообщение от stuper


И еще более конкретный вопрос:
Свойство FileName диалога OpenDialog (для выбора файла) хранит путь и имя файла в Ansi String.
Функция StgIsStorageFile(wсhar_t *) для определения является ли файл структурированным хранилищем (коим является Word-документ) требует параметр типа wсhar_t *. Что надо сделать и как, чтобы передать имя выбранного файла с помощью диалога в эту функцию.
Следующее не помогло:
void *uk;
wchar_t *wh;
ukvoid*)(&S);
whwchar_t*)uk;
LONG l = StgIsStorageFile(wh);
какой бы я файл не выбирал функция возвращает одно и тоже значение (File not found).
Отвечаю на свой вопрос, может кому тоже пригодиться.
//выбрать файл
OpenDialog1->Execute();
S=OpenDialog1->FileName;
//Проверка - является ли указанный файл структурированным хранилищем.
int bufsize; //размер, который будет занимать строка wchar_t
wchar_t *wh; // это понятно указатель
str=&S;
bufsize=str->WideCharBufSize(); //собственно сам метод из //AnsiString для определения размера массива после преобразования
wh=new wchar_t [bufsize]; //выделение памяти под этот массив
wh=str->WideChar(wh,bufsize);//само преобразование.
Вобщем, просто так эти типы друг к другу не приводятся.

Цитата:
Сообщение от mik-a-el
Находите библитотеку типов ворда - ее и использовать.
Пробую работать с этой библиотекой, но вот что получается (точнее не получается):

кинул на форму один WordApplication и один WordDocument из вкладки Office2k. В соответстующих местах появились необходимые заголовки и объявления.
С помощью такого кода
__________________________________________
// TWordApplication *MSWord;
// TWordDocument *WordDoc;
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
MSWord->set_Visible(true);
MSWord->Dialogs->Item(wdDialogFileOpen)->Show();
WordDoc->ConnectTo(MSWord->ActiveDocument);
}
______________________________________________
надеялся вызвать word, выбрать любой документ, сделав его активным.
Далее с ним надо проделать следующие манипуляции - задать пароль на открытие и закрыть. Но до этого не дошло, потому что на этапе компиляции выскакивают следующие ошибки:
[C++ Error] Unit1.cpp(23): E2015 Ambiguity between wdDialogFileOpen and Word_2k::wdDialogFileOpen
[C++ Error] Unit1.cpp(23): E2285 Could not find a match for Word_2k:ialogs::Item(WdWordDialog)
Код брал из примера Русской справки по Builder Архангельского. Почему он у меня не работает и что надо сделать чтобы заработал?

1.Ответьте пожалуйста, всегда ли загруженный Ворд с помощью Connect(), если с ним разрывать связь пользуясь Disconnect() при закрытии программы написанной в Builder6 будет закрываться.
Можно ли каким-нибудь образом оставить его (Ворд) работающим при закрытии моей проги.
Использую компоненты TWordApplication и TWordDocument. Свойства AutoConnect, AutoQuit = false.

2. Где-то прочитал, что вызов любого свойства или метода TWordApplication автоматически вызывает метод Connect(). По опыту понял, что это действительно так. Еще один момент - при добавлении на форму компонента TWordApplication в классе формы появляется описание соответствующего указателя. Но по тексту программы ни где память для него не выделяется явным образом. В связи с этим догадка №1 - " при вызове метода Connect() выделяется память и с ней связывается указатель".

3. Логично было бы предположить, что метод Disconnect() должен был бы эту память освобождать.
Делаем дисконнект, оставляя работающим сервер. Но почему при повторном вызове Connect(), даже если ConnectKind=ckNewInstance приложение связывается с уже запущенным сервером Word.
А если применить к указателя метод Free(), то при повторном вызове Connect() связаться с сервером уже не может. Как же так выделяя память раньше он не может выделить теперь?

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

Цитата:
Сообщение от stuper
Код:
// TWordApplication *MSWord;// TWordDocument *WordDoc;__fastcall TForm1::TForm1(TComponent* Owner): TForm(Owner){MSWord->set_Visible(true);MSWord->Dialogs->Item(wdDialogFileOpen)->Show();WordDoc->ConnectTo(MSWord->ActiveDocument);}
надеялся вызвать word,
C этим я справился, уже не помню как, извините.
У меня теперь другой вопрос. Надеюсь, что на него я получу ответ раньше чем сам найду.
Ладно по сути.
У меня есть форма, на ней поле . В него вводится пароль. Есть кнопка Button. при нажатии на которую берется введеный в поле пароль и передается в открытый документ Word. И сразу же это изменение сохраняется. Так я устанавливаю пароль на документ.
Вот код
Код:
void __fastcall TPassword::SetPas_ButtonClick(TObject *Sender){ if(N) {int bufsize;AnsiString s=Password_Edit->Text;bufsize=s.WideCharBufSize();wchar_t *wh=new wchar_t [bufsize];AnsiString s1(WordDoc->FullName);if(Application->MessageBox(s1.c_str(), "подтверждение пароля", MB_YESNO)==IDYES) { wh=s.WideChar(wh,bufsize); WordDoc->set_Password(wh); WordDoc->Save(); }else { delete wh; return; }delete wh; }}
Если же сразу заглянуть в меню сервиспараметры на вкладку безопасность в Worde.
Мы это изменение будем лицезреть.
Мы можем ввести в поле другой пароль, нажать SetPas_Button и снова увидеть измененный пароль.
Но вот горе, я не могу найти способ как таким же нажатием на UnsetPas_Button (другая кнопка для снятия пароля) снять этот пароль. Пытался оставлять пустую строку и снова нажимать на SetPas_Button - это не приводит к изменениям, пароль какой был на документе такой и остается. Пытался делать так:
Код:
wh=L""; WordDoc->set_Password(wh);
Ничего не помогает. Посоветуйте что можно еще сделать.

Народ, кто-нибудь знает, как объекты Equation в JPG перевести???