![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неизвестное програмное исключение OS !!! [D7, WinXP]
Святослав © (2005-11-05 11:14:00)Здравствуйте уважаемые мастера !!!
У меня появилась проблема которую я немогу решить уже несколько дней! да и понять почему она появляеться ! При этом компилятор не "ругаеться" ! :(
В главном модуле я работаю с регистром ! Все нормально !! Но как только я добавляю процедуру из модуля ShellAPI , при этом опять таки же Компилятор не "ругаеться" :( но как только пытаюсь запустить программу - Бах ошибка -
"Неизвестное програмное исключение ... RTL90.BPL ... OS Function Failed !" ... !!!!
вод исходник главного модуля:
program programm;
uses
Forms, SysUtils, Dialogs, Registry,
mainform in 'mainform.pas' {mainform1};
{$R *.res}
// процедура простого симетричного шифрования текста по паролю
procedure SimetricCoding(var text: string; password: string;
decode: boolean);
var
i, PasswordLength: integer;
sign: shortint;
begin
PasswordLength := length(password);
if PasswordLength = 0 then
Exit;
if decode then
sign := -1
else
sign := 1;
for i := 1 to Length(text) do
text[i] := chr(ord(text[i]) + sign *
ord(password[i mod PasswordLength + 1]));
end; //Конец процедуры
var LastDate, NowDate: TDateTime;
LimitString: String;
LimitInteger: Integer;
RegFile: TRegIniFile;
begin
RegFile:=TRegIniFile.Create('{02D4B3F1-FD88-11D1-960D-00805FC79235}');
NowDate:=Date;
LastDate:=RegFile.ReadDate('{AEF2255D-9EA0-4971-8777-603DE5B65BDF}');
if NowDate<LastDate then
begin
showmessage('Системные часы настроены неправильно !');
halt;
end;
if NowDate>LastDate then
begin
LimitString:=RegFile.ReadString('','{AEF2255D-9EA0-4971-8777-00805FC75BDF}',LimitString);
SimetricCoding(Limitstring,'k4e5X8y8u0n6>5a1q9.7t5t7',true);
LimitInteger:=strtoint(LimitString);
LimitString:=inttostr(LimitInteger-1);
SimetricCoding(LimitString,'k4e5X8y8u0n6>5a1q9.7t5t7',false);
RegFile.WriteDate('{AEF2255D-9EA0-4971-8777-603DE5B65BDF}',NowDate);
RegFile.WriteString('','{AEF2255D-9EA0-4971-8777-00805FC75BDF}',LimitString);
RegFile.Free;
end;
Application.Initialize;
Application.CreateForm(Tmainform1, mainform1);
// EOSError - OS Function Failed (RTL90.bpl)
Application.Run;
end.
-----------------------------
а вот исходник главной формы:
unit mainform;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, SHellAPI, Menus;
type
Tmainform1 = class(TForm)
TrayMenu: TPopupMenu;
procedure FormDestroy(Sender: TObject);
procedure FormCreate(Sender: TObject);
private
FIconData:TNotifyIconData;
public
procedure WndProc(Var Msg: TMessage); override;
end;
var
mainform1: Tmainform1;
implementation
{$R *.dfm}
//Ошибка происходит как только дописую эту процедуру
//без нее все нормально ! :(
Procedure Tmainform1.WndProc(Var Msg:TMessage);
Var P:TPoint;
Begin
If Msg.Msg=WM_USER+1
then Case Msg.lParam of
WM_LbuttonDblClk:
begin
end;
WM_RBUTTONDOWN:
begin
SetForegroundWindow(Handle);
GetCursorPos(P);
TrayMenu.Popup(P.X,P.Y);
PostMessage(Handle,WM_NULL,0,0);
End;
end;
End;
procedure Tmainform1.FormCreate(Sender: TObject);
begin
With FIconData do
begin
cbSize:=SizeOf(FIconData);
Wnd:=Handle;
uID:=100;
uFlags:=NIF_MESSAGE+NIF_ICON+NIF_TIP;
uCallbackMessage:=WM_USER+1;
hIcon:=Application.Icon.Handle;
StrPCopy(szTip,Application.Title)
end;
Shell_NotifyIcon(NIM_ADD,@FIconData);
end;
procedure Tmainform1.FormDestroy(Sender: TObject);
begin
Shell_NotifyIcon(NIM_DELETE,@FIconData);
end;
end.
--------
помогите пожалуйста !! ненаю что делать :(
компилятор у меня 2005 Architect !
если надо то пришлю на мыло исходник в архиве !
Заранее очень благодарен !!!
Святослав (2005-11-06 12:28:00) [1]С уважением ! Благодарю за вашу помощь !!! :)
gdaujk (2005-11-06 10:37:00) [2]> YuRock © (06.11.05 05:10) [9]
...можно при WM_KEYUP и WM_LBUTTONUP что-то одно и то же делать.
WM_KEYUP и WM_LBUTTONUP - заранее известные константные сообщения :-)
Ладно, это уже флуд пошел.
Вот с этим полностью согласен :-))) Дискуссия не в тему...
Zeqfreed (2005-11-06 09:53:00) [3]gdaujk © (05.11.05 20:01) [6]
Бывают такие случаи когда, например, требуется динамически создавать новые сообщения или использование константных значений не желательно; тогда регистрируется новое сообщение в системе (см. RegisterWindowMessage) и затем оно обрабатывается в оконой ф-ции.
Назвать случай когда нельзя обойтись константными значениями я, пожалуй, затрудняюсь, возможно он и существует.
YuRock (2005-11-06 05:10:00) [4]Мало ли для чего? Например, можно при WM_KEYUP и WM_LBUTTONUP что-то одно и то же делать.
Ладно, это уже флуд пошел. Извините, админы :)
gdaujk (2005-11-06 05:03:00) [5]YuRock © (06.11.05 04:36) [7]
Спасибо за ответ. Только для чего это можно использовать? Только что для блокировки обработки сообщений WM_MY_FIRST <= Mes <= WM_MY_LAST...
YuRock (2005-11-06 04:36:00) [6]> Подскажите, а то так и помру дураком
Пример использования заранее неизвестных ( не "константных" сообщений ):
procedure Tmainform1.WndProc(Var Msg:TMessage);
const
WM_MY_FIRST = WM_USER + 100;
WM_MY_LAST = WM_USER + 200;
begin
if ( Msg.Msg >= WM_MY_FIRST ) and ( Msg.Msg <= WM_MY_LAST ) then begin
// какой-то код
end else
inherited;
end;
gdaujk (2005-11-05 20:01:00) [7]> Zeqfreed © (05.11.05 17:17) [5]
А WM_USER+1 - это заранее известное константное сообщение? Не приходит что-то на ум заранее неизвестное вариантное сообщение :-( Подскажите, а то так и помру дураком.
Zeqfreed (2005-11-05 17:17:00) [8]gdaujk © (05.11.05 15:59) [4]
Предложенным тобой способом можно обрабатывать только заранее известные константные сообщения.
gdaujk (2005-11-05 15:59:00) [9]Ну ты приколол :-)
Приношу свои изинения Автору. Просто по-началу немного не понял его...
> Zeqfreed © (05.11.05 15:02) [3]
В WndProc inherited первой строкой, можно не первой.
Согласен, это проблемму автора решает. Только вопрос: в чём приемущества способа обработки сообщений, предагаемого автором, по сравнению с gdaujk © (05.11.05 13:27) [1]? Есть ли они вообще?
Zeqfreed (2005-11-05 15:02:00) [10]Святослав (05.11.05 11:14)
В WndProc inherited первой строкой, можно не первой.
gdaujk © (05.11.05 13:27) [1]
> Ну ты приколол :-)
Чем он тебя приколол?
Anatoly Podgoretsky (2005-11-05 13:39:00) [11]Какой то компонент от Дельфи 9
gdaujk (2005-11-05 13:27:00) [12]работаю с регистром
Ну, правильнее, наверное, с реестром...
Procedure Tmainform1.WndProc(Var Msg:TMessage);
Ну ты приколол :-) Тебе чего надо-то: делать что-то при пориходе сообщений. Если так, то, например, для WM_USER+1 сделай:
type
TForm1 = class(TForm)
...
private
procedure OnSysTrayMes(var message: TMessage); message WM_USER+1;
...
end;
implementation
procedure TForm1.OnSysTrayMes(var message: TMessage);
begin
case message.lParam of
WM_LBUTTONDBLCLK:
begin
...
end;
WM_RBUTTONDOWN:
begin
...
end;
end;
end;
...
end.