• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

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

    Запись на курс до 25 апреля. Получить промодоступ ...

Показ документа Ms Word в приложении в Readonly

  • Автор темы Barmutik
  • Дата начала
Статус
Закрыто для дальнейших ответов.
B

Barmutik

Вопрос следующий:

Каким образом можно показать документ внутри программы только в режиме просмотра?

Желательно бы конечно следующее .. открыть документ.. сделать там изменения для показа и показывать пользователю, но что бы он изменить ничего не мог!
 
B

Barmutik

Ну дык и объяните как его можно открыть .. изменить потом что-то .. потом показать пользователю и что б он был РидОнли в этом OLE контейнере ?
 
Z

zubr

1. Окрыть документ через OLE в режиме Visible=False
2. Внести программно изменения
3. Сохранить программно документ
4. Закрыть документ
5. Открыть документ в OleContainer в режиме внедрения (без связывания) + OleContainer.Enabled:=False
 
B

Barmutik

А вот мне надо изменения не сохранять...

Задача следующего рода:

1. Открываем документ
2. Ищем в нём требуемые врагменты
3. Перекрашиваем0выделяем их
4. Показываем всё это человеку
5. Он иммет возможность ходить к пред и след выделнным фрагментам
6. Документ НЕ должен сохранить никаких изменений...
 
Z

zubr

Используем не OleContainer, а RichEdit, где RichEdit.ReadOnly:=True
1. Открываем документ
2. Ищем в нём требуемые врагменты
3. Перекрашиваем0выделяем их
4. Сохраняем во временный файл в RTF-формате
5. Загружаем временный файл в RichEdit
6. После окончания работы программы удаляем временный файл
 
B

Barmutik

Вариант конечно нормальный ... но .. надо что бы полностью сохранился формат документа .. а при конверте в РТФ этого не происходит .. опять же эти операции на больших фалах займут очень много времени .. а это критично ...
 
Z

zubr

Ну а попроще варианты:
1. ActiveDocument.ReadOnly = True
2. Установить атрибут файла только для чтения
 
B

Barmutik

В качестве попроще вариантов ответы :

1. ReadOnly - совйство только по чтению
2. Если поставить атрибут тоько для чтения, то я не смогу внести свои изменения.

Спасибо за попытки помочь, я уже перепробовал кучи способов ... простые варианты не подходят .. просто я думаю вдруг кто обладает тайными знаниями :)
 
Z

zubr

Если поставить атрибут тоько для чтения, то я не смогу внести свои изменения.
Так а что мешает менять этот атрибут программно. Перед изменениями снять его, затем опять поставить.
 
B

Barmutik

Не совсем понял ..

1. Снял аттрибут
2. Внёс изменения
3. Поставил ... но документ то уже открыт в ворде ???


Что надо переоткрывать ? Если да то это не вариант .. для больших объёимов ..
 
Z

zubr

1. Снял аттрибут
2. Внёс изменения
3. Поставил ... но документ то уже открыт в ворде ???
Сохранить то юзверь свои изменения не сможет, вернее сможет но в другой файл. Согласен, решение не очень красивое, так как изменения юзверь все таки может делать, сохранять не может. Вот еще вариант:
1. Создаете поток, отслеживающий окно документа. Если оно появилось и активно, подменяете процедуру окна, в которой разрешаете только сообщения WM_SCROLL.
Остальная последовательность действий.
 
B

Barmutik

Вроде как вариант нашёлся ... использования Protect

Но ... в ворде он работает .. а когда использую его как сервер но протектит нормально .. а вот распротектить уже не хочет :D

Глюки какие-то ... нифига нормально не работает ...

Ещё глюкан вылез .. если прячеш тулбары в окне где показывается ворд то если потом вне программы открываеш Ворд то там тоже нет тулбаров :(

Куда не кинь .. всё не так... :D
 
Z

zubr

Проверил, у меня снимает защиту нормально. Вот код:
Код:
procedure TForm1.Button3Click(Sender: TObject);
var
ev:variant;
begin
W:=CreateOleObject('Word.Application');
W.visible:=True;
W.Documents.open('MyFile.doc');
ev:=wdAllowOnlyFormFields;
W.Documents.Item('MyFile.doc').Protect(ev);
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
W.Documents.Item('MyFile.doc').Unprotect;
end;
 
B

Barmutik

Так да!

Может я что криво делаю ... можно попросить пример такой же когда Ворд открывается в TIOleContainer !

Может у меня уже глаза замылились ...
 
Z

zubr

Вот сделал по простому, вроде работает:
Код:
procedure TForm1.Open2Click(Sender: TObject);
begin
OLEContainer1.CreateObjectFromFile('MyFile.doc', False);
OleContainer1.DoVerb(ovPrimary);
end;

procedure TForm1.Protect1Click(Sender: TObject);
var
ev, w:variant;
begin
ev:=wdAllowOnlyFormFields;
w:=OleContainer1.OleObject;
w.Protect(ev);
end;

procedure TForm1.Unprotect2Click(Sender: TObject);
var
w:variant;
begin
w:=OleContainer1.OleObject;
w.Unprotect;
end;
 
B

Barmutik

Так что-то я не догоняю ...

Какое Дельфи ? Какой Ворд?

У меня такой код вообще при попытке протекта вываливает ошибку...

Можно экзешник .. которуму указываеш путь какой файл гузить ... потом две кнопки протект и анпротект ...

Ну и с исходниками можно :D)

Бо что-то я видать или конкретно туплю .. или где-то тут собака зарыта всё таки ...
 
Z

zubr

Delphi5, WordXP.
Куда сбросить экзешник с исходником?
 
Z

zubr

Да, проверил, в Delphi7 при установке Protect выбрасывает ошибку сервера. Delphi7 вообще с вордом глючно работает, я помню как то задавал вопрос на эту тему. Ну еще может быть, так как в Delphi5 делалось, используется модуль Word97 вместо WordXP в Delphi7. А экзешник скомпилированный в Delphi5 работает корректно, тестировал в WinXP и Win98, WordXP.
 
B

Barmutik

Так .. у меня Д7... само по себе не важно какой модуль .. мы ж используем поздне связывание...

И что интересно это глюк 7 Дельфи .. пора на C# сваливать .. устал я от таких глюков .. :D
 
Статус
Закрыто для дальнейших ответов.
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!