type
TWndClassA = packed record
style: UINT;
lpfnWndProc: TFNWndProc;
cbClsExtra: Integer;
cbWndExtra: Integer;
hInstance: HINST;
hIcon: HICON;
hCursor: HCURSOR;
hbrBackground: HBRUSH;
lpszMenuName: PAnsiChar;
lpszClassName: PAnsiChar;
end;
PWndClassA = ^TWndClassA;
function RegisterClassA(const lpWndClass: PWNDCLASSA): ATOM; stdcall; external 'user32.dll' name 'RegisterClassA';
function TWinControl_Create(p: TWinControl): TWinControl; stdcall; export;
var
_msg: TMsg;
err : DWORD;
WndClass: TWndClassA;
className: AnsiString;
function IsClassRegistered(cName: PAnsiChar; hInst: HINSTANCE): BOOL;
begin
if GetClassInfoA(hInst, cName, @WndClass) then
begin
writeln('ClassInfo: ' + IntToStr(GetLastError));
Exit(true);
end else
Exit(false);
end;
begin
{$ifdef DLLDEBUG}
writeln('TWinControl: Create');
{$endif DLLDEBUG}
if p = nil then
begin
ShowError(sError_TWinControl_ref);
exit(nil);
end;
className := 'MyWindowClass';
//FillChar(WndClass, sizeof(TWndClassA), 0);
//WndClass.cbSize := sizeof(TWndClassExA);
WndClass.style := CS_HREDRAW or CS_VREDRAW;
WndClass.lpfnWndProc := @GlobalWndProc;
WndClass.cbClsExtra := 0;
WndClass.cbWndExtra := 0;
WndClass.hInstance := hInstanceDLL;
WndClass.hIcon := LoadIconA (0, PAnsiChar(32512));
WndClass.hCursor := LoadCursorA(0, PAnsiChar(32512));
WndClass.hbrBackground := HBRUSH(COLOR_WINDOW + 1);
WndClass.lpszMenuName := nil;
WndClass.lpszClassName := PAnsiChar(className);
//WndClass.hIconSm := 0;
if WndClass.hInstance <> 0 then
ShowMessage('size: ' + IntToStr(Integer(hInstanceDLL)));
if @WndClass.lpfnWndProc = nil then
ShowMessage('gfe = nil');
ShowMessage('len: ' + IntToStr(StrLen(WndClass.lpszClassName)));
//if IsClassRegistered(WndClass.lpszClassName, hInstanceDLL) then
begin
writeln('unregister class.');
UnregisterClassA(PAnsiChar(ClassName), hInstanceDLL);
end;
writeln('last error : ' + IntToStr(GetLastError));
//writeln('cbSize : ' + IntToStr(WndClass.cbSize));
writeln('lpfnWndProc : ' + IntToStr(Integer(PtrUInt(@WndClass.lpfnWndProc))));
writeln('lpszClassName: ' + WndClass.lpszClassName);
writeln('hInstance : ' + IntToStr(Integer(WndClass.hInstance)));
if RegisterClassA(@WndClass) = 0 then
begin
writeln('DLL error: ' + IntToStr(GetLastError));
Halt(255);
end;
end;