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

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

Автор: rrromano
Дата сообщения: 21.09.2012 22:40
exteris
Проще. Но, видимо, не подходит ). Видимо, нужно гарантировать "правильное" нажатие кнопки )
Автор: Dimrix
Дата сообщения: 21.09.2012 23:54

Цитата:
Dimrix
А не проще перед установкой предупредить юзера о том, что сейчас будут установлены драйвера, и ему нужно будет согласиться с их установкой?

Если б юзеры были адекватными не пришлось бы прогу писать, ибо достали звонить когда к тырнету не подключается модем: им уже и инструкцию пошаговую с картинками даёшь и девайсы с максимальным удобством, но если тело в тырнет первый раз лезет то какие там драйвера и прочее. А когда табличка ещё и красного цвета, так вообще всё вирус и нужно сразу отказаться... вообщем юзверы...
ЗЫ: TThread не работал гляну, но пока вышел из положения тупым простым методом: написал софт в 3 процедуры, который живёт максимум 20 сек и каждые 0,5с проверяет на наличие гр...го окна ну и закрывает его при появлении после чего и сама программка завершается досрочно. Знаю что глючно но пока так, поищу что вы мне посоветовали и как с ним бороться
Автор: Dimrix
Дата сообщения: 22.09.2012 10:55
Frodo_Torbins

Цитата:
Dimrix
TThread и вперед, на амбразуру!

Хочу уточнить: для работы с ним мне нужно запускать 2 потока как я понимаю. Причём один поток запустить процесс "одноразовый" т.е. без цикла:

procedure TThreadDrv1.Execute;
var res:Cardinal;
begin
ClWin;//Synchronize(ClWin);
end;
procedure TThreadDrv1.ClWin;
var res:Cardinal;
begin
DriverPackageInstall (Drv, DRIVER_PACKAGE_LEGACY_MODE or DRIVER_PACKAGE_FORCE, nil, NR);
end;

а второй в цикле:

procedure TThreadDrv.Execute;
begin
while not Terminated do
begin
ClWin;//Synchronize(ClWin);
end;
end;
procedure TThreadDrv.ClWin;
begin
EnumWindows(@EnumWindowsProc, Longint(Form1));
end;

Так вот когда дело доходит до установка драйвера, всё так же вываливается око, мой софт стопорится и ждёт отклик юзврея, т.е. EnumWindows(@EnumWindowsProc, Longint(Form1)); не выполняется, где собственно и должна происходить работа за юзверя. Что написано не так?
Автор: Frodo_Torbins
Дата сообщения: 22.09.2012 18:26
Dimrix
Из потока нельзя обращаться к VCL. А судя по Longint(Form1) вы именно так и делаете. Если вам все же нужно обратиться к форме, то к вашим услугам Synchronize.
И еще в вашем цикле какой-нибудь Sleep(100) не помешал бы, чтобы одноядерный проц на 100% не грузить и не мешать тем самым процессу установки дров.
Автор: Dimrix
Дата сообщения: 22.09.2012 22:45
Frodo_Torbins

Цитата:
Из потока нельзя обращаться к VCL. А судя по Longint(Form1) вы именно так и делаете. Если вам все же нужно обратиться к форме, то к вашим услугам Synchronize.
И еще в вашем цикле какой-нибудь Sleep(100) не помешал бы, чтобы одноядерный проц на 100% не грузить и не мешать тем самым процессу установки дров.

Synchronize я не просто так закоментил - с ним вообще даже до установки дров дело даже не доходит...
По поводу Sleep - в основном коде когда я запускаю два потока после чего делаю Sleep(25000) (так много для отладки что бы фиксить куда заходит через Ф8 или брекпоинты). Так вот исследования показали, что не смотря в каком порядке я запускаю потоки, сперва происходит как правило "проверка выпадания окна" после чего доходит до установки драйвера - выпадает окно и всё тишина никаких других процессов не происходит (специально ждал 25сек). Запускал не из под Делфи (вдруг мои точки останова мешали) тоже доходит до окна и всё никаких других процессов (специально ставил счётчики в потоке и менял Caption). Пока мыслей нету у меня как победить одним приложением
Автор: Frodo_Torbins
Дата сообщения: 23.09.2012 10:21
Dimrix
Цитата:
после чего делаю Sleep(25000)
И замораживаете петлю сообщений основного потока. После этого вполне естественно что Synchronize не работает.

Цитата:
сперва происходит как правило "проверка выпадания окна"
Потому, что как раз в ее потоке Sleep-а нету.

Цитата:
выпадает окно и всё тишина никаких других процессов не происходит
Скорее всего поток сканирования окон замораживается из-за обращения к VCL, которая, в свою очередь, заморожена из-за Sleep-а в основном потоке.
Автор: shok
Дата сообщения: 23.09.2012 14:15
Привет всем.
Помогите с утилиткой, кот сможет в дампе файла BIOS найти заданную текстовую строку и адрес первго после строки файла скинуть в ини-файл. Буду премного благодарен тем кто откликнится или направит на путь истиный, куда обратиться.
Автор: Frodo_Torbins
Дата сообщения: 23.09.2012 18:56
shok
Для каждого типа биосов существуют утилиты, способные его распаковать и как-нибудь отредактировать. А найти заданную строку в распакованном файле можно любым hex-редактором.
Автор: Aleksandr N
Дата сообщения: 27.09.2012 11:13
Поздравляю программистов с неофициальным выходом Win8 и с новыми проблемами.
Решил проверить работу своей программы на Win8, которая замечательно работала на всех версиях ОС начиная с 2000, а здесь не захотела.
Проблема заключается в следующем.
Делаю системный хук в библиотеке и в зависимости от ситуации передаю данные через PostMessage в программу. Вот эти PostMessage и не доходят/отсылаются.
При этом, если я посылаю сообщение программе из библиотеки, например:

procedure SetHook; stdcall;
begin
hHookCallWindowProc := SetWindowsHookEx(WH_CALLWNDPROC, @CallWndProc, hInstance, GetWindowThreadProcessId(hWnd, nil));
OldWindowProc := TFNWndProc(SetWindowLong(hkWnd, GWL_WNDPROC, LongInt(Addr(NewWindowProc))));
OldNotifyWindowProc := TFNWndProc(SetWindowLong(hNotifyWnd, GWL_WNDPROC, LongInt(Addr(NewNotifyWindowProc))));
PostMessage(WndОкнаПрограммы, Сообщение, Параметр1, Параметр2);
end;

то сообщения доходят, но если я это делаю из перехваченной функции:

function NewWindowProc(h_Wnd: HWND; Msg: UINT; wp: WPARAM; lp: LPARAM): LRESULT; stdcall;
begin
Result := 0;
case Msg of
WM_MOUSEMOVE: begin
PostMessage(WndОкнаПрограммы, Сообщение, Параметр1, Параметр2);
Exit;
end;
end;
Result := CallWindowProc(OldWindowProc, h_Wnd, Msg, wp, lp);
end;

то сообщения не доходят/отсылаются.

Устанавливал режимы совместимости, права администратора, включал-отключал Контроль Учётных Записей, добавил в манифест строку поддержки Win8 - результата никакого.

Вопрос
1. Как ещё можно заменить PostMessage (SendMessage к стати то-же не работает) чтобы действовало по подобному типу.
2. Может можно как-то "выйти" из-под перехваченной процедуры и там послать сообщение (пописать промежуточную функцию, вставить её вместо PostMessage и из этой функции послать сообщение - не работает).
3. Какие-нибудь умные мысли, советы чтобы всё это заработало.

Здесь
http://rghost.ru/40562934
пример подобной программы (не мой) которая делает похожее. Откомпилировано на XE3. Эта программа даже не загружает библиотеку. А если загрузит (один раз из 20 запусков), то управление при помощи PostMessage также не возможно.

Спасибо.
Автор: alex1334
Дата сообщения: 24.10.2012 22:32
Подскажите пожалуйста где ошибка
На форме установил ColorDialog.
оператор i:=form1.ColorDialog1.CustomColors.Count; возвращает 0
и поэтому for i:=0 to 15 do
CustomColors.ValueFromIndex[i]
вызывает ошибку
Ни как у меня не получается задать эти 16 предустановленых цветов при открытии диалога.
Автор: ant0ni02004
Дата сообщения: 25.10.2012 00:28
alex1334
во первых

Код: for i:=0 to form1.ColorDialog1.CustomColors.Count-1 do
Автор: alex1334
Дата сообщения: 25.10.2012 17:51
ant0ni02004
Спасибо за помощь.
Честно говоря я думал что при создании объекта строки как то инициализируются
Автор: akaGM
Дата сообщения: 25.10.2012 18:02
alex1334
инициализируются...
нулями в лучшем случае...
Автор: ant0ni02004
Дата сообщения: 25.10.2012 23:06
akaGM

Цитата:
инициализируются...

alex1334

Цитата:
строки как то инициализируются

так если бы инициализировались - было бы Count>0
Автор: akaGM
Дата сообщения: 26.10.2012 00:00
ant0ni02004

что? :)
Автор: alex1334
Дата сообщения: 26.10.2012 00:24
Помогите еще немного

implementation
var vT1:TcolorDialog=nil;

procedure TForm1.FormActivate(Sender: TObject);
begin
vT1.Create(self); При выполнении этого оператора возникает исключение EAccessViolation
Автор: akaGM
Дата сообщения: 26.10.2012 00:34
попробуй так:

vT1 := TColorDialog.Create(self);
Автор: salexn1
Дата сообщения: 26.10.2012 12:16
alex1334

vT1 - это объект (если быть точным - указатель на объект)
TcolorDialog - это класс

для создания объекта нужно создать экземпляр класса, т.е. не vT1.Create, а TSomeClasss.Create()
Автор: Ichigo2
Дата сообщения: 26.10.2012 17:57
Кто помнит срытую настройку в Делфи, которая автоматически подставляет параметры в процедуру по CNTRL+SPACE?
Т.е. пишешь процедуру, скажем MyProc, жмеш сонтрол+пробел и делфи делает так MyProc(var1,var2,var4) а не MyProc().
В интеренте было, вспомнить блин не могу
Автор: alex1334
Дата сообщения: 26.10.2012 20:56
akaGM
Все работает спасибо ВСЕМ
Автор: exteris
Дата сообщения: 27.10.2012 11:54
Ichigo2
Ctrl+Shift+Space
Автор: alex1334
Дата сообщения: 28.10.2012 18:23
Подскажите возможно ли как то настроить функцию format() чтобы выводимое число дополнялось слева нулями до нужной длинны
пробовал format('%8x',[p1]);но получается если размер меньше 8 символов то слева дополняются пробелы
Или быть может существует другая функция преобразования числа в строку но обязательно надо чтобы строка выводилась в HEX формате (то есть были бы числа A..F) и выводимая строка всегда была бы с фиксированным значением HEX-чисел без пробелов
Автор: apnss
Дата сообщения: 28.10.2012 19:04
alex1334

IntToHex
Автор: A_V
Дата сообщения: 28.10.2012 19:46
alex1334
%.8x
Автор: alex1334
Дата сообщения: 30.10.2012 23:19
A_V
Пробовал ставить 8 с точкой и без точки. Если число меньше то формат дополняет слева пробелы до заданного размера. А нужно нули. Так как если в строке есть пробелы то обратное преобразование строки в число вызывает исключение например вот с таким сообщением
error... '$ FF005'
Может у меня что в глобальных настройках провайдера формата не так установлено
Вроде есть также функция позволяющая удалять пробелы из строки
Хочу также добавить что $ это я сам приписываю во время вызова StrToInt() так как эта функция вообще не понимает чисел A..F
Автор: A_V
Дата сообщения: 31.10.2012 14:29
alex1334
странно, с точкой должно работать. вот так
ShowMessage(Format('%.8x', [$FF]));
что выдает?

От настроек не должно зависеть, цитата из хелпа D6:

Цитата:

Hexadecimal. The argument must be an integer value. The value is converted to a string of hexadecimal digits. If the format string contains a precision specifier, it indicates that the resulting string must contain at least the specified number of digits; if the value has fewer digits, the resulting string is left-padded with zeros
Автор: Czechoslovak
Дата сообщения: 31.10.2012 14:59
alex1334

формат %.8х слева 0: Format('%.8x',[1234]) > [000004D2]
формат %8х слева пробелы: Format('%8x',[1234]) > [ 4D2]

Функция trim удаляет пробелы
Автор: Ichigo2
Дата сообщения: 01.11.2012 20:33
Привет.
Есть такой неприятный косяк.
Загружаю файл в stringlist

Код: var F : TStringList;
...
F:=TStringList.Create();
F.LoadFromFile(path);
Автор: ant0ni02004
Дата сообщения: 02.11.2012 00:13
Ichigo2
давайте полную информацию
- что за исключение происходит (тип, текст)
- где именно (строчка кода)
а то так только гадать можна - на LoadFromFile или потом при использовании (тогда и тот код нужен)
Автор: krapotkin
Дата сообщения: 02.11.2012 09:36
Ichigo2
Предполагается. что LoadFromFile готов прочитать то, что записалось в SaveToFile.
Думаю, что просто не предполагается, что в строке вообще могут быть символы #0.
Обойти это можно, загрузив файл в TFileStream и далее оттуда добавлять построчно в StringList

Накладные расходы - 10 строк кода.

Страницы: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374

Предыдущая тема: MPO File


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