Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4

Модерирует : ShIvADeSt

ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477  Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

   

Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Вытащить оттуда эту функцию затруднительно, т.к. она вызывает другие функции, написанные с помощью ассемблерных вставок, а также использует инициализируемые константы (к примеру, символ разделителя целой и дробной частей, символ отделения тысяч). Проще найти модуль целиком

----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 09:27 20-08-2008
Dimoniusis



Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Maks150988 у тебя 2 делита - имхо они работают весьма медленно. Если вызовы будут редки - можно оставит. Я бы сделал байт копированием - работает очень быстро. Пробегаемся по строке проверяя на начало. Если нашли - ставим булевскую переменную и SetLength результу. И так до второго куска.

Всего записей: 4134 | Зарегистр. 18-10-2005 | Отправлено: 09:29 20-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar79
А вы случаем не занете где такой модуль то найти? Решил поискать на сайте KOL и порылся в исходниках, думал там есть, все-таки большая часть VCL кода в ихних функциях сделана ассемблерными вставками, но не нашел.
Dimoniusis
Придется наверное парсер сделать как вы и предложили надо понимать.

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 10:30 20-08-2008 | Исправлено: Maks150988, 10:31 20-08-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
Maks150988, какой версией Delphi пользуетесь? Думаю, кто-то поделится, хотя лучше, конечно же, найти дистрибутив и выполнить полную установку, а то неизвестно какие еще сюпризы может приподнести урезанная версия


----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 11:03 20-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar79
Делфи 7

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 11:09 20-08-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
anfilat
Попытался я сделать раннее связывание. Сделал импорт. Получившийся код:

Цитата:
implementation
 
uses dm, Word_TLB;
 
var
  IfWordApp: IInterface;
  IfDocs: Documents;
  IfApp: WordApplication;
  IfOpenDoc: WordDocument;
  IfAllWords: Words;
 
{$R *.dfm}
 
procedure TForm1.btnOpenClick(Sender: TObject);
var
  FlName: OleVariant;
  i: integer;
  tWord: WideString;
 
begin
  if not OpenDialog1.Execute then exit;
  FlName := OpenDialog1.FileName;
 
  IfWordApp := CoWordApplication.Create;
  IfWordApp.QueryInterface(Documents, IfDocs);
 
  IfOpenDoc := IfDocs.Open(FlName, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam, EmptyParam, EmptyParam, EmptyParam, EmptyParam,
                  EmptyParam);
 
  IfDocs.Item(FlName).Activate;
 
  IfWordApp.QueryInterface(WordApplication, IfApp);
  IfAllWords := IfApp.ActiveDocument.Words;
 
  DataModule2.words.Exclusive := true;
  DataModule2.words.Active := true;
  if not DataModule2.words.IsEmpty then DataModule2.words.EmptyTable;
  DataModule2.words.IndexName := 'Words';
  DataModule2.words.DisableControls;
 
  Edit1.Text := IntToStr(IfAllWords.Count);
 
  for i := 1 to IfAllWords.Count do
  begin
    tWord := IfAllWords.Item(i).Text;
    Edit2.Text := IntToStr(i);
    if tWord[1] <= ' ' then continue;
    Application.ProcessMessages;
    if DataModule2.words.FindKey([tWord]) then begin
      DataModule2.words.Edit;
      DataModule2.words['Count'] := DataModule2.words['Count'] + 1;
      DataModule2.words.Post; end
      else begin
        DataModule2.words.Insert;
        DataModule2.words['Word'] := tWord;
        DataModule2.words['Count'] := 1; end;
  end;
  DataModule2.words.EnableControls;
 
end;

Word (2007) запускается, но на методе IfOpenDoc := IfDocs.Open(FlName, EmptyParam ... программа вылетает с ошибкой:

Цитата:
Project DBWords.exe raised exception class EAccessViolation with message 'Access violation at address 004D3E9A in module 'DBWords.exe'. Read of address 00000000'. Process stopped. Use Step or Run to continue.

Что не так сделано?

Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 19:59 20-08-2008 | Исправлено: DmitryKz, 20:01 20-08-2008
RomanTim

Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
DmitryKz
А почему ты решил, что объект, реализующий WordApplication, реализует и Documents? Вообще-то Documents это его свойство, а QueryInterfaice скорее всего возвращает ошибку, что интерфейс не поддерживается.
Попробуй так:
Код:
uses WordXP;
...
var
  app: WordApplication;
  docs: Documents;
begin
  app := CoWordApplication.Create;
  if app <> nil then begin
    docs := app.Documents;
    if docs <> nil then begin
      ...
    end;
  end;
end;

 
Кстати, если бы написал IfDocs := IfWordApp as Documents, то был бы тот же самый QueryInterface,  только ты сразу получил бы соответствующе исключение, а не абстрактный нулевой указатель

Всего записей: 375 | Зарегистр. 11-09-2003 | Отправлено: 00:21 21-08-2008 | Исправлено: RomanTim, 00:26 21-08-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
RomanTim
Так сработало, хотя все равно не понимаю, почему со сделанным через импорт модулем Word_TLB не хочет.
По этому способу я не отметил никакого ускорения работы в сравнении с использованием IDispatch. Придется парсить слова.

Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 02:28 21-08-2008
ShIvADeSt



Moderator
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
DmitryKz
Вот что нагуглил

Код:
 
Получение информации из Word
 
Если кто-то не помнит — Word когда-то был текстовым процессором, поэтому из уважения к его истории в нем эти функции все еще присутствуют. Информацию из Word можно получить через интерфейс «IdataObject». Для получения указателя на этот интерфейс необходимо использовать функцию «QueryInterface».
 
Документы Word поддерживают стандартные форматы CF_TEXT и CF_METAFILEPICT так же как ряд других специфических форматов, включая RTF и structured storage. Для стандартных форматов используются константы значений переменной «cfFormat», но для других форматов нужно делать запрос, используя функцию «EnumFormatEtc». Эта функция возвратит список обеспечиваемых форматов. Требуемый формат из этого списка затем передается функции «GetData» интерфейса «IDataObject». Значение cfFormat для одинаковых форматов может различаться на разных компьютерах, поэтому всегда должно находиться с помощью функции «EnumFormatEtc». Для подробной информации относительно методов интерфейса «IdataObject» можно обратиться к файлам помощи по программированию в Win32.
 
Код:
uses Word_TLB;
 
function GetRTFFormat(DataObject: IDataObject; var RTFFormat: TFormatEtc):
Boolean;
var
Formats: IEnumFORMATETC;
TempFormat: TFormatEtc;
cfRTF: LongWord;
Found: Boolean;
begin
try
OleCheck(DataObject.EnumFormatEtc(DATADIR_GET, Formats));
cfRTF := RegisterClipboardFormat('Rich Text Format');
Found := False;
while (not Found) and (Formats.Next(1, TempFormat, nil) = S_OK) do
if (TempFormat.cfFormat = cfRTF) then begin
RTFFormat := TempFormat;
Found := True;
end;
Result := Found;
except
Result := False;
end;
end;
 
procedure GetRTF(WordDoc: _Document);
var
DataObject: IDataObject;
RTFFormat: TFormatEtc;
ReturnData: TStgMedium;
Buffer: PChar;
begin
if (Assigned(WordDoc)) then try
WordDoc.QueryInterface(IDataObject, DataObject);
if GetRTFFormat(DataObject, RTFFormat) then begin
OleCheck(DataObject.GetData(RTFFormat, ReturnData));
//RTF is passed through global memory
Buffer := GlobalLock(ReturnData.hglobal);
//Buffer is a pointer to the RTF text
//Insert code here to handle the RTF text (ie. save it, display it etc.)
GlobalUnlock(ReturnData.hglobal);
end;
except
ShowMessage('Error while getting RTF');
end;
end;
 

взято тут http://itword.net/modules/myarticles/article.php?storyid=98
как видишь, тут получают текст в виде RTF, а дальше можно попробовать работать уже с памятью. В общем надо отказываться от работы с самим вордом, а оперировать с данными в памяти. Тот же rtf грузануть в RichEdit контрол и попробовать уже парсить его.  
 
ЗЫ. Сделай отдельную тему - это не совсем типовая задача, а поинтереснее. И перенеси, если не трудно, наработки из этой темы (например, спросил тото ответили тото). Будем в той теме думать.

----------
И создал Бог женщину... Существо получилось злобное, но забавное...

Всего записей: 3956 | Зарегистр. 29-07-2003 | Отправлено: 03:08 21-08-2008
DmitryKz

Silver Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
ShIvADeSt
Спасибо за интересную статью! Тему открою, только освобожусь немного от работы.

Всего записей: 3144 | Зарегистр. 29-09-2005 | Отправлено: 18:26 21-08-2008
xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите плиз где найти/посмотреть модули с шифрованием для делфи (т.е. хорошо реализованные на паскале)
 
Интересует двустороннеее шифрование, чуточку сложнее чем XOR, но не сильно, т.е. чтоб код был не многотысячным исходником, спасибо :)
 
ЗЫ. К сожалению точные алгоритмы назвать не могу - не помню правильных названий из курса по криптографии - помню только что есть всякие алгоритмы со сдвигами, основанные на умножении по модулю и т.п. методиками на остатках по модулю - т.е. шифруют они достаточно просто, но взламываются существенно сложнее чем XOR :)

----------
Счастливые мысли приводят к счастливой клеточной биохимии

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 00:07 22-08-2008
afiget



Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
xy
http://algolist.manual.ru/defence/well_known/index.php

Всего записей: 545 | Зарегистр. 31-12-2005 | Отправлено: 00:27 22-08-2008
xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
afiget
спасибо, изучу

----------
Счастливые мысли приводят к счастливой клеточной биохимии

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 01:10 22-08-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
xy, нашел в папке с лабораторными по ИБиЗИ (Информационная безопасность и защита информации), на 3 курсе делал. Тема "Применение метода гаммирования для шифровки и дешифровки текста". Исходник
 
В папке с программой ложишь файл source.txt с текстом, программа после выполнения создает файлы coded.txt и decoded.txt, с зашифрованным и обратно расшифрованным сообщением. Где-то была методичка, там много теории по разным методам, найти не могу

----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 05:36 22-08-2008
xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar79
спасибо
плохо что он xor`ит и использует только три параметра, т.е. зная шифр и исходный текст довольно просто, по-моему найти параметры :)
однако сам метод освежил в памяти, как отправная точка очень полезно ;)

----------
Счастливые мысли приводят к счастливой клеточной биохимии

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 09:58 22-08-2008
Jokerjar79



Advanced Member
Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору
xy, это хотя и простой, но достаточно эффективный метод. По этим трем параметрам осуществляется не непосредственное шифрование, а генерация псевдослучайной последовательности. Таким образом, каждый байт шифруется xor'ом не постоянным числом, а элементом ключевого потока. И такой шифр нельзя взломать анализом частот появления символов и т.п. В примере используетя длина гаммы 8 байт, хотя ее можно сделать любой длины (например, использовать длину гаммы равную длине сообщения)

----------
www.MyFirstSite.ru - информационный ресурс для начинающих веб-мастеров

Всего записей: 710 | Зарегистр. 08-09-2007 | Отправлено: 10:56 22-08-2008
xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar79
да мне понравилось :), только помоему мы такое взламывали "в столбик" на контрольный с короткой последовательностью.. 1 или 2
 
но точно не скажу, увы, уже всё позабывал
 
но методикой воспользуюсь :) главное, что просто :)

----------
Счастливые мысли приводят к счастливой клеточной биохимии

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 12:26 22-08-2008
xy



ХУдератор
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Jokerjar79
я так понимаю делать
     generategamma;
в цикле нет никакой необходимости :)

----------
Счастливые мысли приводят к счастливой клеточной биохимии

Всего записей: 10530 | Зарегистр. 28-05-2003 | Отправлено: 22:42 22-08-2008 | Исправлено: xy, 22:43 22-08-2008
Gnusss88

Newbie
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Привет всем.
 
Уже достаточно давно (безуспешно как видите) ищу реализацию LZX (используется в chm, cab и др…) алгоритма для Делфи.  Собственно пока ничего не нашел, поэтому и решил спросить.
Может, кто видел где-нибудь такую вещь?
На то, что такая вещь может существовать указывает программа CHM Editor (http://www.gridinsoft.com/downloads.php), она написана на делфи и может редактировать chm файлы, там как раз используется LZX.
 
Заранее благодарю за ответ.

Всего записей: 9 | Зарегистр. 07-04-2005 | Отправлено: 01:34 23-08-2008
Maks150988



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Собственно такой вопросик. Чето не доперло решение...
Имеем

Код:
type
  FN_HTTPDOWNLOAD = function(szURL : PChar; szMethod : PChar; szArgs : PChar; szReferrer : PChar; szContentType : PChar; pBuffer : pBYTE; dwMaxBufferLen : DWORD) : BOOL; stdcall;

Этой функцией мы посылаем запрос на сервер и она возвращает полученный результат в подготовленный буфер.
В плагине есть функция GetAccountState для общения с программой. Так вот выглядит она примерно так:

Код:
function GetAccountState(блаблабла; httpDownload : FN_HTTPDOWNLOAD) : BOOL; stdcall;
begin
//httpDownload является функцией обратного вызова. То есть
 
httpDownload(TszURLGetBalance, TszMethod, PChar(Format(TszArgsData, [szAccount, szPassword])), nil, nil, @ResultBuffer, Length(ResultBuffer));
 
//И весь ответ сервера в ResultBuffer. Дальше парсим как хотим...
end;
 

Собственно захотелось не громоздить код написанием собственной отправки запроса на сервер, а воспрользоваться текущей функцией httpDownload. Сделал следующее:
 

Код:
 
function GetStkCardBilling(hWndNum, hWndPsw, hWndBil : THandle; httpDownload : FN_HTTPDOWNLOAD) : Boolean;
var
  szLogin    : String;
  szPassword : String;
  szBilling  : String;
begin
  szLogin := Edit_GetText(hWndNum);
  szPassword := Edit_GetText(hWndPsw);
  httpDownload('http://адрес', 'POST', 'username=szLogin&password=szPassword', nil, nil, @szBuffer, Length(szBuffer));
  szBilling := szBuffer;
  SendMessage(hWndBil, WM_SETTEXT, 0, Integer(PChar(szBilling)));
  Result := TRUE;
end;
 

 
Функция вроде как бы работает. Но теперь интресует способ ее вызова.
Сделал так, потому что хз правильно не правильно, вообщем чего-то не понятно:
 

Код:
 
var
dwReturn    : DWORD;
-------------
GetStkCardBilling(GetDlgItem(hStk, ID_CARD_NUMBER), GetDlgItem(hStk, ID_CARD_PASSWD), GetDlgItem(hStk, ID_INFO_UPDATE), dwReturn);
 

То есть суем в функцию хэндлы полей ввода и собираем с них нужную инфу, а дальше через функцию все что нужно делаем. Но проблема с 4 параметром тут. Комплятор говорит что нужна какая-то переменная. Ну я посмотрел как колбеки делают. Ну вроде так сделал. Но походу httpDownload таким макаром ничего и не грузит, наверное даже дело до этого не доходит. От незнания перепробывал всякие варианты "в лоб". И даже FN_HTTPDOWNLOAD(dwReturn) подставил в 4 параметр... Буфер пуст. Может быть необходимо прототип функции писать в этом случае? Я без понятия...

Всего записей: 836 | Зарегистр. 23-12-2006 | Отправлено: 18:19 23-08-2008 | Исправлено: Maks150988, 18:22 23-08-2008
   

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Delphi (все версии) - часть 4
ShIvADeSt (28-06-2009 02:10): Продолжение в http://forum.ru-board.com/topic.cgi?forum=33&topic=10477


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru