1. Пользуйтесь тегами кода. - [code] ... [/code] 2. Точно указывайте язык, название и версию компилятора (интерпретатора). 3. Название темы должно быть информативным. В описании темы указываем язык!!!
Я поставил пакет win32ada, он создал папку include\win32ada Если написать первой строкой test.gpr with "win32ada", то среда ругается при открытии пакета:
[2011-02-08 16:25:57] C:\Program Files\ADA\projects\TEST\test.gpr:1:06: unknown project file: "win32ada" [2011-02-08 16:25:57] Error while loading project 'C:\Program Files\ADA\projects\TEST\test.gpr'. Loading the default project.
Ну я это убрал. Добавил в test.gpr строчку
for Source_Dirs use ("..\..\include\win32ada\**");
Пишу в test.adb with win32.winuser (вроде все основные функции, типа окно нарисовать итд, там). Компилирую.
gnatlink "C:\Program Files\ADA\projects\TEST\test.ali" -shared-libgcc -g -g -fprofile-generate -o "C:\Program Files\ADA\projects\TEST\test.exe" c:/program files/ada/bin/../libexec/gcc/i686-pc-mingw32/4.3.6/ld.exe: cannot find -lwin32ada collect2: ld returned 1 exit status gnatlink: error when calling C:\Program Files\ADA\bin\gcc.exe gnatmake: *** link failed.
[2011-02-08 16:28:19] process exited with status 4 (elapsed time: 06.26s)
with Ada.Exceptions; use Ada.Exceptions; with Ada.Task_Termination; use Ada.Task_Termination; with Ada.Task_Identification; use Ada.Task_Identification;
package Err is
protected End_Of is procedure World(C : Cause_Of_Termination; T : Task_ID; X : Exception_Occurrence); end End_Of;
end Err;
+
with Ada.Exceptions; with Ada.Text_IO;
package body Err is
protected body End_Of is procedure World(C : Cause_Of_Termination; T : Task_ID; X : Exception_Occurrence) is My_File : ada.Text_IO.File_Type; begin case C is when Normal => null; when Abnormal => Ada.Text_IO.Put_Line ("Abnormal termination of Task" & Image(T)); when Unhandled_Exception => Ada.Text_IO.Create(My_File, Ada.Text_IO.Out_File, "My.txt"); Ada.Text_IO.Put_Line (My_File, "Unhandled exception in Task : " & Image(T)); Ada.Text_IO.Put_Line (My_File, Exception_Information(X)); Ada.Text_IO.Put_Line (My_File, "End logging"); Ada.Text_IO.Close (My_File); end case;
end World; end End_Of;
end Err;
(Исправил на вывод в файл, иначе могут быть проблемы с запуском вне среды)... Что это дает?
Подключаешь этот пакет, и в самом начале основной процедуры:
with Err; use Err; with Ada.Task_Termination;
procedure Main is -- ... begin Ada.Task_Termination.Set_Dependents_Fallback_Handler(End_Of.World'Access); -- ...
Вот сейчас специально нашел машину с Windows XP, запустил там программу, которая из WndProc бросает исключение (то самое деление на 0). Вот чего показывает:
N:\Just_Test\debug\main Unhandled exception in Task : main_task_003E4008 Exception name: CONSTRAINT_ERROR Message: wndproc.adb:59 divide by zero Call stack traceback locations: 0x401e99 0x401f08 0x7e418732 0x7e418814 0x7e4189cb 0x7e4196c5 0x401e1d 0x4017a6 0x401235 0x4012a6 0x7c817075
End logging
, ну а потом программа благополучно рушится... То есть, что-то типа старой доброй паскалевской ExitProc. Сделать вроде ничего уже нельзя, но зато получить информацию о том, что произошло - можно... Для логирования - в самый раз...
P.S. В случае Ады проблем еще, похоже, добавляет GCC. Погугли на тему +"windows callback" +exceptions, и на тему dwarf2 vs sjlj exceptions