Форум: "WinAPI";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
ВнизНеизвестное програмное исключение OS !!! Найти похожие ветки
← →
Святослав (2005-11-05 11:14) [0]Здравствуйте уважаемые мастера !!!
У меня появилась проблема которую я немогу решить уже несколько дней! да и понять почему она появляеться ! При этом компилятор не "ругаеться" ! :(
В главном модуле я работаю с регистром ! Все нормально !! Но как только я добавляю процедуру из модуля 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 !
если надо то пришлю на мыло исходник в архиве !
Заранее очень благодарен !!!
← →
gdaujk © (2005-11-05 13:27) [1]работаю с регистром
Ну, правильнее, наверное, с реестром...
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.
← →
Anatoly Podgoretsky © (2005-11-05 13:39) [2]Какой то компонент от Дельфи 9
← →
Zeqfreed © (2005-11-05 15:02) [3]Святослав (05.11.05 11:14)
В WndProc inherited первой строкой, можно не первой.
gdaujk © (05.11.05 13:27) [1]
> Ну ты приколол :-)
Чем он тебя приколол?
← →
gdaujk © (2005-11-05 15:59) [4]Ну ты приколол :-)
Приношу свои изинения Автору. Просто по-началу немного не понял его...
>Zeqfreed © (05.11.05 15:02) [3]
В WndProc inherited первой строкой, можно не первой.
Согласен, это проблемму автора решает. Только вопрос: в чём приемущества способа обработки сообщений, предагаемого автором, по сравнению с gdaujk © (05.11.05 13:27) [1]? Есть ли они вообще?
← →
Zeqfreed © (2005-11-05 17:17) [5]gdaujk © (05.11.05 15:59) [4]
Предложенным тобой способом можно обрабатывать только заранее известные константные сообщения.
← →
gdaujk © (2005-11-05 20:01) [6]>Zeqfreed © (05.11.05 17:17) [5]
А WM_USER+1 - это заранее известное константное сообщение? Не приходит что-то на ум заранее неизвестное вариантное сообщение :-( Подскажите, а то так и помру дураком.
← →
YuRock © (2005-11-06 04:36) [7]> Подскажите, а то так и помру дураком
Пример использования заранее неизвестных ( не "константных" сообщений ):
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-06 05:03) [8]YuRock © (06.11.05 04:36) [7]
Спасибо за ответ. Только для чего это можно использовать? Только что для блокировки обработки сообщений WM_MY_FIRST <= Mes <= WM_MY_LAST...
← →
YuRock © (2005-11-06 05:10) [9]Мало ли для чего? Например, можно при WM_KEYUP и WM_LBUTTONUP что-то одно и то же делать.
Ладно, это уже флуд пошел. Извините, админы :)
← →
Zeqfreed © (2005-11-06 09:53) [10]gdaujk © (05.11.05 20:01) [6]
Бывают такие случаи когда, например, требуется динамически создавать новые сообщения или использование константных значений не желательно; тогда регистрируется новое сообщение в системе (см. RegisterWindowMessage) и затем оно обрабатывается в оконой ф-ции.
Назвать случай когда нельзя обойтись константными значениями я, пожалуй, затрудняюсь, возможно он и существует.
← →
gdaujk © (2005-11-06 10:37) [11]>YuRock © (06.11.05 05:10) [9]
...можно при WM_KEYUP и WM_LBUTTONUP что-то одно и то же делать.
WM_KEYUP и WM_LBUTTONUP - заранее известные константные сообщения :-)
Ладно, это уже флуд пошел.
Вот с этим полностью согласен :-))) Дискуссия не в тему...
← →
Святослав (2005-11-06 12:28) [12]С уважением ! Благодарю за вашу помощь !!! :)
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2006.01.15;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.012 c