При попытке скомпилировать GraphiX в FPC версии выше 1.0.9, возникает ошибка (в 1.0.9 все отлично - думаю многие слышали о библиотеке GraphiX) Итак, ошибка возникает здесь: (модуль gxdd.pp)
FUNCTION DDInit(hInst:THANDLE;nCmdShow:integer):HResult; VAR wc:WNDCLASS; ddsd:TDDSurfaceDesc; ddscaps:TDDSCaps2; dddi:TDDDeviceIdentifier; hRet:HRESULT; { pDDTemp:IDirectDraw; } i:integer; BEGIN GXMouseCallbackUsed:=FALSE; {===== Set up and register window class } wc.style:=CS_HREDRAW OR CS_VREDRAW; wc.lpfnWndProc:=@WindowProc;
На строчке
wc.lpfnWndProc:=@WindowProc;
Вот какая ошибка:
gxdd.pp(359,19) Error: Incompatible types: got "<address of function(LongWord, LongWord, LongWord, LongInt):LongInt;StdCall>" expected "<procedure variable type of function(LongWord, LongWord, LongInt, LongInt):LongInt;StdCall>"
Вроде все соответсвует, но почему-то ошибка вылазиет! Повторю, что в FPC 1.0.9 все компилируется.
WNDPROC = function (_para1:HWND; _para2:UINT; _para3:WPARAM; _para4:LPARAM):LRESULT;stdcall;
Это все что касается левой части строчки (до оператора := ) в которой ошибка. Вот что относиться к @WindowProc; (то есть адрес получаем )
FUNCTION WindowProc(h_Wnd:HWND;aMSG:Cardinal; wParam:Cardinal;lParam:Integer):longint;stdcall; VAR hRet:HRESULT; ret,i,j:integer, SysUtils, GraphiX,gxcrt; kbstate:array[0..255] of byte; keybuffer:word; BEGIN CASE aMSG OF {===== Pause if minimized } WM_ACTIVATE: BEGIN IF GraphiXActive THEN DDBackUp; GXbActive:=(HIWORD(wParam)=0); Result:=0; Exit; END; {====== } WM_ACTIVATEAPP: BEGIN { PrntStr(h_wnd,50,50,'Backup/Restore '+hexlong(wParam)+' '+hexlong(lParam)+' '+hexlong(h_wnd)); } IF GraphiXActive THEN IF (wParam<>0) THEN DDRestore; Result:=0; exit; END; {===== Clean up and close the app } WM_DESTROY: BEGIN DDDone; PostQuitMessage(0); Result:=0; Exit; END; {===== Handle any non-accelerated key commands } WM_KEYDOWN: BEGIN GetKeyboardState(@kbstate); ret:=ToASCII(wparam AND $FF,(lParam SHR 16) AND $FF,@kbstate,@keybuffer,0); CASE ret OF 0:BEGIN putchar(#0); putchar(chr((lParam SHR 16) AND $FF)); END; 1:BEGIN putchar(chr(keybuffer AND $FF)); END; END; END; {===== Turn off the cursor since this is a full-screen app } WM_SETCURSOR: BEGIN SetCursor(0); SetCapture(h_wnd); { PrintString(random(400),random(300),'WM_SETCURSOR'); } Result:=1; Exit; END; WM_LBUTTONDOWN, WM_MBUTTONDOWN, WM_RBUTTONDOWN, WM_LBUTTONUP, WM_MBUTTONUP, WM_RBUTTONUP, WM_MOUSEMOVE: BEGIN {PrintString(300,200,long2str(loword(lparam))); PrintString(300,220,long2str(hiword(lparam))); PrintString(300,240,long2str(wParam));} { GetClientRect(h_wnd,@Rect); GXmx:=loword(lparam)+Rect.left; GXmy:=hiword(lparam)+Rect.top; } GXmx:=loword(lparam); GXmy:=hiword(lparam); GXmb:=0; IF (wParam<>0) THEN BEGIN IF (wParam AND MK_LBUTTON<>0) THEN GXmb:=GXmb OR $01; IF (wParam AND MK_RBUTTON<>0) THEN GXmb:=GXmb OR $02; IF (wParam AND MK_MBUTTON<>0) THEN GXmb:=GXmb OR $04; END; IF GXMouseCallbackUsed THEN GXMouseCallback; { IF NOT GraphiXActive THEN BEGIN GXamx:=GXmx; GXamy:=GXmy; END; }
Кто-нибудь знает в какую сторону копать что бы избавиться от этой ошибки? Я уже исправил все, что нужно для успешной компиляции GraphiX'a, осталось кажется только это, но проблемма в том, что gxdd это главный модуль GraphiX'a, и без этой wc.lpfnWndProc:=@WindowProc; просто никак!
--------------------
Помогая друг другу, мы справимся с любыми трудностями! "Не опускать крылья!" (С)