Ru-Board.club
← Вернуться в раздел «Прикладное программирование»

» Вопросы по Delphi (до версии 2009) - часть 5

Автор: psa1974
Дата сообщения: 28.10.2009 13:48
JohnSilver182
Нихто и не говорил, что просто! Наоборот - прямая работа с указателями - потенциальный источник проблем (хотя и открываются большие возможности). Тут надо отдавать полный отчет своим действиям, поскольку компилятор на такие вещи смотрит "сквозь пальцы" - его достаточно легко ввести в заблуждение.

Добавлено:
Cryogen2003
А зачем так сложно? а напрямую почитать в реестре, какая программа ассоциирована с нужным расширением и запустить ее через, например ф-цию CreateProcess? Простой юзер же вроде имеет доступ к реестру по чтению?
Автор: volser
Дата сообщения: 28.10.2009 14:41
Cryogen2003
Какого размеры файлы? Если маленькие можно писать во временную директорию и не удалять их, или же удалять при старте приложения.
Автор: psa1974
Дата сообщения: 28.10.2009 15:35
Cryogen2003
Смотри под # запуск программы по расширению (имя исполняемого модуля берется из реестра)...

Автор: Cryogen2003
Дата сообщения: 28.10.2009 15:48
psa1974
Секунду, ну программу я предположим запустил, но в нее же надо передать сам файл для открытия.
Ну может быть вы просто меня не совсем поняли, к примеру я должен открыть файл Excel, то есть должен запустить сам excel с параметром в виде этого файла

volser
Файл может быть 20 килов, а может быть и 20 мегов (программа по электронодокументообороту ).

Автор: Frodo_Torbins
Дата сообщения: 28.10.2009 15:57
Cryogen2003
WinRAR при каждом запуске проверяет не остались ли старые временные файлы, и если остались, то удаляет.
Еще при создании файла можно ему указать атрибут FILE_FLAG_DELETE_ON_CLOSE.
Автор: SIgor33
Дата сообщения: 28.10.2009 15:59
Программно из бд загружается данные в richеdit потом нужно найти в нем слова по шаблону и выделить .......
как мне найти слова по шаблону типа "л*лиум" где * любое колво символов.....
Автор: Cryogen2003
Дата сообщения: 28.10.2009 16:03
Frodo_Torbins
Во, интересный флаг, надо почитать на эту тему.

А так, все бы хорошо, при выходе из программы я подчищаю файлы (ну просто в массиве храню все имена файлов, которые не смог удалить когда), но файл может быть открыт и тогда не удалиться
Автор: psa1974
Дата сообщения: 28.10.2009 16:10
Cryogen2003
Да, не так понял
Хорошо, тогда такой вариант: запускаем программу вместе с файлом через ту же ф-цию CreateProcess (почти как в том варианте, что я привел), получаем дескриптор созданного процесса и ожидаем, пока процесс не завершится, после чего со спокойной душой и чистой совестью убиваем файл. Если надо будет пример реализации - скажи, скину...
Автор: Cryogen2003
Дата сообщения: 28.10.2009 16:16
psa1974
Да не, с реализацией то все понятно, просто по идее тоже нельзя сидеть и ждать до последнего, пока документ просмотрят, закроют процесс и только потом прибивать все. Просто я тут вспомнил есть программа, которая умеет закрывать все дескрипторы и потом в принципе можно с файлом делать что хочешь (программа звалась Unlocker), вот и подумал, что может быть это легко сделать

Хотя судя по всему придется сделать именно как ты сказал, а то пользакам дай волю, так пооткрывают у себя 100 документов
Автор: psa1974
Дата сообщения: 28.10.2009 16:26
Cryogen2003
Да я понял, к чему ты клонишь, кстати, на днях узнал, что вышла ее новая версия Unlocker 1.8.8 (не рекламы ради а для эрудиции) Но тут не все так просто - надо копать WinApi... Возможно, вешать ловушки...
С другой стороны, есть ограничения моего варианта. Например, после того как юзер нажал у тебя кнопочку и как итог запустился Эксель с документом:
- юзер открыл в нем еще документы и начал их править... потом закрыл твой документ, а отсальные продолжает править... и так до конца рабочего дня...
- юзер не закрывая эксель, закрыл твою программу...
Возможно, придется комбинировать предложенные варианты решения.
Автор: Cryogen2003
Дата сообщения: 28.10.2009 16:33
psa1974
Ну да, вот в этом и проблема. Об этом я уже тоже думал и понимаю что не все так хорошо, как хотелось бы. В принципе сначала была мысля создавать в директории с прогой свою директорию и просто потом ее все время зачищать, но в итоге получилась мини проблема. Прога будет валяться на сетевом ресурсе, для обычных смертных там только на чтение и запуск будут права, так что хотя бы директорию не создашь. Плюс могло бы быть, что какой-нибудь пользователь прибил ненароком файл, который сейчас хочет открыть еще один пользователь.
Судя по всему единственный вариант, создавать в Temp свою папку, сохранять туда файлы и при выходе из программы и при запуске ее эту папку чистить.

P.S.: А так честно говоря заклебали, с одного проекта кидают на второй проект, потом на третий и так далее, то есть сейчас просто тупо нет времени, чтобы поддерживать свои основные проекты.
Автор: psa1974
Дата сообщения: 28.10.2009 16:37
Cryogen2003
Тут еще подумал... Не знаю, что у тебя за программа, но может имеет смысл написать простейшую службу, которая будет получать от твоей программы имена открытых файлов (например, через сообщение WM_COPYDATA) и мониторить их (как вариант - тупо периодически пытаться удалить, когда экскль закроют, файл освободится и будет успешно удален). Имхо, неплохое решение ...


Добавлено:
SIgor33
регулярные выражения тебе помогут... мощная весчь! есть бесплатные реализации, например, TRegExpr, есть платные...
Автор: Cryogen2003
Дата сообщения: 28.10.2009 16:41
psa1974
А службу как установить то с правами простого пользователя? А ставить через политики безопасности точно никто у нас не будет.
Автор: psa1974
Дата сообщения: 28.10.2009 16:50
Cryogen2003
А как устанавливаются отсальные проги у твоих юзеров? Зарегистрировать службу под учеткой администратора (или от его имени), а потом она будет работать под юзером system независимо от того, какая учетная запись у юзера. Единстенный нюанс (сам прошел через это): у каждого юзера свои сетевые подключения, и в общем случае у юзера system их нет. Т.е. независимо от того, есть сетевые подключения у юзера или нет, служба должна будет сама себе устанавливать сетевые подключения, мапить диски и т.д.

Да, кстати, в случае использования службы кажый юзер будет мониторить только свои временные файлы.
Автор: Cryogen2003
Дата сообщения: 28.10.2009 16:55
psa1974
Проги никак не устанавливаются как класс, есть директория на расшаренном сетевом диске под эту прогу, в директории сама прога и инишник под программу с названием TNS сервака, логином и паролем (ну ессно в кодированном виде) и все. И по такому сценарию делаю все проги.
Автор: Vladkyr
Дата сообщения: 28.10.2009 17:01
SIgor33
Можно попробовать использовать бесплатный класс TRegExpr
Автор: psa1974
Дата сообщения: 28.10.2009 17:03
Cryogen2003
То все понятно - прога запускается с сети, там живет... Но когда я говорил про службу, я имел ввиду что ее надо будет зарегистрировать на каждой машине, где надо - это, конечно, минус, хотя операция элементарная...
В общем, смотри... как хочешь... Мои идеи временно иссякли..
Автор: Cryogen2003
Дата сообщения: 28.10.2009 17:08
psa1974
Операция элементарная, но к сожалению у нас просто в банке все через пятую точку сделано. И точно знаю, что через политику безопастности никто не будет накатывать эту службу.
Судя по всему все сделаю через создание в temp своей директории и просто там буду переодически чистить. Но это еще ладно, какие приколы сейчас у моего напарника, который тоже самое пишет, но под вебом и php. Сегодня уже много пи-пи-пи слышал с его стороны
Автор: volser
Дата сообщения: 28.10.2009 17:18
Cryogen2003
Можно не службу запускать, а еще одну программу которая будет сидеть в трее и мониторить какую то папку даже после выхода из главной программы. Если все документы закрыты то она сама себя выгружает. Запускать можно не в момент запуска главной, а при первом просмотре документа.
Автор: Cryogen2003
Дата сообщения: 28.10.2009 17:21
volser
Кстати хорошая идея, надо попробовать такое сделать. Спасибо. О таком чего-то не догадался.
Автор: psa1974
Дата сообщения: 28.10.2009 17:34
Cryogen2003
и как развитие идеи volser - можно сделать вспомогательную прогу вообще без иконки в трее и без кнопки на панели задач, если не надо взаимодействие с юзером - чтоб глаза не мозолила
Автор: SIgor33
Дата сообщения: 28.10.2009 17:54
Vladkyr
А как это потом все выделить в Richedit другим цветом
Автор: volser
Дата сообщения: 28.10.2009 18:07
SIgor33

Код:
with RichEdit1 do begin
SelStart := 1;
SelLength := 5;
SelAttributes.Color := clRed;
end;
Автор: klb
Дата сообщения: 29.10.2009 00:07
Написал программку из одной строки:
SysUtils.ExecuteProcess('/full/path/to/binary',['arg1','arg2']);

Скомпилил и упаковал UPX'ом.

Внимание, вопрос: насколько сложно постороннему лицу вытащить из экзешника эту самую строку:
'/full/path/to/binary',['arg1','arg2'] ?

Может есть более действенные методы защиты?

PS Я не программер по профессии, просьба не пинать =)
Автор: psa1974
Дата сообщения: 29.10.2009 01:37
klb
Ну, для начала, в модуле SysUtils такой ф-ции нет. но это не важно. Допустим, мы напишем просто
ShowMessage('/full/path/to/binary');

Теперь 2 момента:
1. в неупакованом экзешнике эта строка фигурирует прямым текстом.
2. процедура упаковки UPX'ом обратимая, и зная, что файл упакован UPX'ом (а узнать это не сложно - хотя бы тупо перебирая разные упаковщики ), каждый, кому не лень, сможет его распаковать и с этого места - смотри пункт 1.

Вывод: упаковка UPX'ом никак не защищает - это всего лишь сжатие включенных в экзешник ресурсов.

Цитата:
Может есть более действенные методы защиты?

Безусловно есть - самое простое что приходит на ум - применять шифрование - предварительно получить зашифрованное представление строк и в программе на лету их расшифровывать.
Также есть библиотеки для Дельфи (преимущественно платные), решающие так или иначе задачу защиты (тут я не подскажу, потому что передо мной такой задачи еще не стояло).
Автор: klb
Дата сообщения: 29.10.2009 02:39
psa1974
Ну я использовал Lazarus (оболочку для FreePascal), там эта функция описана в вики.
А так думаю обойтись разбиванием ком. строки на несколько фрагментов и для каждого завести свою переменную. Потом использовать AProcess.CommandLine := var2+var1+var3;
Как-то так.
И, кстати, упаковщик не сильно поменял вид командной строки


Добавлено:
Уря, вопрос решен:


Код: A character can also be specified by its character value (commonly an ASCII code), by preceding the ordinal value with the number symbol (#). For example specifying #65 would be the same as ’A’.
Автор: Grande
Дата сообщения: 29.10.2009 08:27
Добрый день, уважаемые знатоки.
Не поделится ли кто опытом распараллеливания?
Есть потоки (я предпочитаю использовать WinAPI, т.е. BeginThread).
Запущаю поток, он вертится, чего-то считает, что-то куда-то отсылает...
Но есть другой путь - вместо BeginThread пишем SendMessage(Сообщение...), а на приемной стороне (в процедуре обработки этого самого сообщения) пишем такой код:


Код: ReplyMessage(0);//Сразу отсылаем ответ, что, типа, уже обработали
Автор: SIgor33
Дата сообщения: 29.10.2009 09:23
volser
Спасибо все понял
Автор: SerBUser
Дата сообщения: 29.10.2009 10:15
Подскажите, плиз - использую Indy-компонент IdTCPServer
в обработчике onExecute такой код:

Код:
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext);
var
s:string;
begin
s:=AContext.Connection.IOHandler.ReadLn;
if s='aa' then
AContext.Connection.IOHandler.WriteLn('OK')
else
AContext.Connection.IOHandler.WriteLn('ERR');
end;
Автор: GrHnd
Дата сообщения: 29.10.2009 11:05

Цитата:
Подскажите как узнать имя и домен пользователя текущего процесса?

data man, psa1974 Спасибо за ответ. Сам нашел готовый пример - рекомендую - встал как влитой!

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768

Предыдущая тема: Clipper 5


Форум Ru-Board.club — поднят 15-09-2016 числа. Цель - сохранить наследие старого Ru-Board, истории становления российского интернета. Сделано для людей.