Взял за основу пример из DevLinker:
Код:
MODULE MySimple;
(* simple windows application *)
IMPORT S := SYSTEM, WinApi;
CONST
message = "Hello World";
iconId = 1;
VAR
instance: WinApi.HINSTANCE;
mainWnd: WinApi.HWND;
PROCEDURE WndHandler (wnd, msg, wParam, lParam: INTEGER): INTEGER;
VAR res: INTEGER; ps: WinApi.PAINTSTRUCT; dc: WinApi.HDC;
BEGIN
IF msg = WinApi.WM_DESTROY THEN
WinApi.PostQuitMessage(0)
ELSIF msg = WinApi.WM_PAINT THEN
dc := WinApi.BeginPaint(wnd, ps);
res := WinApi.TextOut(dc, 50, 50, message, LEN(message));
res := WinApi.EndPaint(wnd, ps)
ELSIF msg = WinApi.WM_CHAR THEN
res := WinApi.Beep(800, 200)
ELSE
RETURN WinApi.DefWindowProc(wnd, msg, wParam, lParam)
END;
RETURN 0
END WndHandler;
PROCEDURE OpenWindow;
VAR class: WinApi.WNDCLASS; res: INTEGER;
BEGIN
class.hCursor := WinApi.LoadCursor(0, S.VAL(WinApi.PtrSTR,
WinApi.IDC_ARROW));
class.hIcon := WinApi.LoadIcon(instance, S.VAL(WinApi.PtrSTR, iconId));
class.lpszMenuName := NIL;
class.lpszClassName := "Simple";
class.hbrBackground := WinApi.GetStockObject(WinApi.WHITE_BRUSH);
class.style := WinApi.CS_VREDRAW + WinApi.CS_HREDRAW
(* + WinApi.CS_OWNDC + WinApi.CS_PARENTDC *);
class.hInstance := instance;
class.lpfnWndProc := WndHandler;
class.cbClsExtra := 0;
class.cbWndExtra := 0;
res := WinApi.RegisterClass(class);
mainWnd := WinApi.CreateWindowEx({}, "Simple", "Simple Application",
WinApi.WS_OVERLAPPEDWINDOW,
WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
WinApi.CW_USEDEFAULT, WinApi.CW_USEDEFAULT,
0, 0, instance, 0);
res := WinApi.ShowWindow(mainWnd, WinApi.SW_SHOWDEFAULT);
res := WinApi.UpdateWindow(mainWnd);
END OpenWindow;
PROCEDURE MainLoop;
VAR msg: WinApi.MSG; res: INTEGER;
BEGIN
WHILE WinApi.GetMessage(msg, 0, 0, 0) # 0 DO
res := WinApi.TranslateMessage(msg);
res := WinApi.DispatchMessage(msg);
END;
WinApi.ExitProcess(msg.wParam)
END MainLoop;
PROCEDURE Test;
VAR
s: POINTER TO ARRAY OF CHAR;
BEGIN
NEW(s, 131055);
END Test;
BEGIN
instance := WinApi.GetModuleHandle(NIL);
OpenWindow;
Test;
MainLoop
END MySimple.
Добавил процедуру Test. Собрал exe файл при помощи команды:
DevLinker.LinkExe MySimple.exe := Kernel+ MySimple 1 applogo.Ico ~
При запуске программы возникает ошибка:
---------------------------
BlackBox
---------------------------
illegal memory read [ad = 00000000]
- Kernel.CheckCandidates (pc=00002202, fp=0022FF0C)
- Kernel.MarkLocals (pc=000023F7, fp=0022FF28)
- Kernel.FastCollect (pc=000028E4, fp=0022FF38)
- Kernel.NewBlock (pc=00002BDD, fp=0022FF5C)
- Kernel.NewArr (pc=00000CD9, fp=0022FF88)
- MySimple.Test (pc=000001FD, fp=0022FFA0)
- MySimple.$$ (pc=0000001B, fp=0022FFB0)
---------------------------
OK
---------------------------
Если 131055 уменьшить хотя бы на 1, то ошибка не возникает.
Кто-нибудь знает в чем может быть дело?