Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

За 2003-11-30

Re: Как перехватить обращение к файлу

Здравствуйте !

> Hello comp,
>
> Я новичек в программировании под виндовс. Пэтому прошу Вас,
> подскажите, как перехватить обращение программы (консольное
> приложение виндовс) к конкретно заданному текстовому файлу (нужно
> перед чтением этой программы изменить данный текстовый файл).
> Скажите, какие функции виндовс API нужно вызывать, и, если можно,
> примерчик на С (или asm). Программу пишу на ассемблере. Спасибо.

Думал на эту тему...

Похоже, не обойтись без перехвата API - функций (например, CreateFile).
Сам перехват функции - дело сложное. Можно реализоватьего через подмену
адреса в элементе таблиц экспорта загруженного модуля (в адресном
пространстве процесса, за которым) хотите следить. Но это не даст
полной уверенности в результате, поскольку функция может вызываться через
указатель, полученный через GetProcAddress.

С консольным приложением вообще все сложнее. Дело в том, что для перехвата
функции надо внедрить свой код в адресное пространство другого процесса.
Это делается обычно путем загрузки длл с хуком в другой процесс.
Но вся беда в том, что консольные приложения, похоже не имеют очереди
сообщения, а значит, хук бесполезен.
Можно попробовать внедрить код через WriteProcessMemory, а потом
использовать
RPC - удаленный вызов процедур. Но такая схема будет работать только в
WinNT и 2000.

Вообще очень много написано в книге Рихтера "Программирование в Windows
для профессионалов" (кажется так это называется).

Вообще, как видите, довольно сложно.
Но сделать, в принципе можно.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

   2003-11-30 16:07:40 (#27281)

Re: Новости дискуссионного листа "Программирование. Форум !!!"

Здравствуйте !

> На два дня отвлекся от копьютера но продолжим наше обсуждение
>
> > Ясно... У вас, наверно, просто у ричедита не стоял стиль ES_AUTOHSCROLL,
> >то есть возникал эффект 'автопереноса' строк.
>
> Да на самом деле зтот стиль не стоял, думаю его попробовать первым делом
>
> >Хорошо - тогда другой вариант :
>
> ...
>
> А этот алгоритм в случае если не поможет стиль но это только с пон
> едельника
> смогу проверить

Тут по сути дела прикол вот в чем - GetLine для ричедита возвращает
строку именно так, как она представлена в самом элементе управления.
То есть как бы пользователь ее увидел.

А описанный метод просто разбирает текст из контрола на строки, считая
признаком окончания строки \r\n или \r, если после не идет \n

> Теперь по ShellExecute(
> HWND hwnd,
> LPCTSTR lpOperation,
> LPCTSTR lpFile,
> LPCTSTR lpParameters,
> LPCTSTR lpDirectory,
> INT nShowCmd
> );
> Параметр lpOperation в письме имеет значения "print","find" в праве ли я
> предположить что корректны комманды "copy","delete","md" и т.д.

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

> Если нет то как их реализовать?

Реализовать лучше средствами языка программирования.

Например для копирования есть API - функции :

BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);

и

BOOL CopyFileEx(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
LPPROGRESS_ROUTINE lpProgressRoutine,
LPVOID lpData,
LPBOOL pbCancel,
DWORD dwCopyFlags
);

вторая отличается от первой тем, что в нее можно передать
указатель на функцию обратного вызова (CALLBACK) и на основе этого,
например, сделать индикатор копировния.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

   2003-11-30 16:07:28 (#27280)

Re: Новости дискуссионного листа "Программирование. Форум !!!"

Здравствуй Vic!
На два дня отвлекся от копьютера но продолжим наше обсуждение

> Ясно... У вас, наверно, просто у ричедита не стоял стиль ES_AUTOHSCROLL,
>то есть возникал эффект 'автопереноса' строк.

Да на самом деле зтот стиль не стоял, думаю его попробовать первым делом

>Хорошо - тогда другой вариант :

> m_wndRichEdit.GetWindowText(strText);

> strText.Replace("\r\n", "\n");
> strText.Replace('\r', '\n');

> int nTextLen = strText.GetLength();

> for(int nNextPos, nBegPos = 0;
> nBegPos < nTextLen;
> nNextPos ++, nBegPos = nNextPos)
> {
> nNextPos = strText.Find('\n', nBegPos);

> if(nNextPos < 0)
> nNextPos = nTextLen;

> strLine = strText.Mid(nBegPos, nNextPos - nBegPos);

> MessageBox(strLine);
> }
А этот алгоритм в случае если не поможет стиль но это только с понедельника
смогу проверить

Теперь по ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
Параметр lpOperation в письме имеет значения "print","find" в праве ли я
предположить что корректны комманды "copy","delete","md" и т.д.
Если нет то как их реализовать?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

   "vlad" 2003-11-30 14:13:32 (#27242)