Итак, ошибка возникает здесь:
(модуль 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 все компилируется.
Вот тип WNDCLASS
WNDCLASS = record
style : UINT;
lpfnWndProc : WNDPROC;
cbClsExtra : longint;
cbWndExtra : longint;
hInstance : HANDLE;
hIcon : HICON;
hCursor : HCURSOR;
hbrBackground : HBRUSH;
lpszMenuName : LPCTSTR;
lpszClassName : LPCTSTR;
end;
Вот тип, проблеммной WNDPROC:
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; }
Result:=0;
Exit;
END;
END;
Result:=DefWindowProc(h_Wnd,aMSG,wParam,lParam);
END;
Кто-нибудь знает в какую сторону копать что бы избавиться от этой ошибки? Я уже исправил все, что нужно для успешной компиляции GraphiX'a, осталось кажется только это, но проблемма в том, что gxdd это главный модуль GraphiX'a, и без этой
wc.lpfnWndProc:=@WindowProc; просто никак!
