Свои апплеты в панели управления.

=== Свои апплеты в панели управления. ===
 Компилятор: Delphi 3.x
 Источник: www.borland.com.
Примечание Vit: Более поздние версии Дельфи имеют встроенные средства для создания апплетов - см. New Project->Other->Control Panel...
Апплеты в панели управления, это обычные DLL, имеющие расширение .cpl (Control Panel Library) и располагающиеся в системной директории Windows. В свою очередь, в каждом файле cpl может храниться несколько апплетов. Cpl имеет единственную функцию точки входа CPlApplet(), через которую поступают все сообщения от панели управления.
Давайте рассмотрим сообщения, с которыми панель управления вызывает функцию CPlApplet():
* CPL_INIT - сообщение, которым CPlApplet() вызывается первый раз (инициализация). Возвращаем TRUE для продолжения процесса загрузки.
* CPL_GETCOUNT - этим сообщением панель управления запрашивает количество поддерживаемых апплетов в файле cpl.
* CPL_INQUIRE - панель управления запрашивает информацию о каждом апплете, хранящемся в файле cpl. При этом, параметр lParam1 будет содержать номер апплета, о котором панель управления хочет получить информацию, lParam2 будет указывать на структуру TCplInfo. Поле idIcon в структуре TClpInfo должно содержать идентификатор (id) ресурса иконки, которая будет отображаться в панели управления, а поля idName и idInfo должны содержать идентификаторы строковых ресурсов для имени и описания. lData может содержать данные, которые будут использоваться апплетом.
* CPL_SELECT - это сообщение посылается апплету, если его иконка была выбрана пользователем. При этом lParam1 содержит номер выбранного апплета, а lParam2 содержит значение lData, определённое для данного апплета.
* CPL_DBLCLK - это сообщение будет послано, если по иконке апплета сделать двойной щелчёк. lParam1 будет содержать номер апплета, а lParam2 будет содержать значение lData, определённое для данного апплета. При поступление это сообщения апплет должен как-то показать себя, в частности отобразить своё диалоговое окно.
* CPL_STOP - Посылается каждому апплету, когда панель управления закрывается. lParam1 содержит номер апплета, а lParam2 содержит значение lData, определённое для данного апплета.
* CPL_EXIT - Посылается перед тем, как панель управления вызовет FreeLibrary.
* CPL_NEWINQUIRE - тоже, что и CPL_INQUIRE за исключением того, что lParam2 указывает на структуру NEWCPLINFO.
Итак, приступим. Для начала необходимо создать файл ресурсов, содержащий таблицу строк для имени и описания Вашего апплета(ов), а также иконки для каждого апплета (если у Вас их будет несколько).
Пример .rc файла содержит таблицу строк, состоящую из двух строк, и указатель на файл с иконкой:
 STRINGTABLE
 {
 1, "TestApplet"
 2, "My Test Applet"
 }
 
 2 ICON C:\SOMEPATH\CHIP.ICO
Чтобы преобразовать файл .rc в .res, (который можно будет спокойно прилинковать к Вашему приложению) достаточно просто указать в командной строке полный путь до компилятора ресурсов и полный путь до файла .rc:
 c:\Delphi\Bin\brcc32.exe c:\Delphi\MyRes.rc
После того, как компиляция будет завершена, то Вы получите новый файл, с таким же именем, что и .rc, только с расширением ".res".
Следующий пример, это апплет панели управления, который в ответ на сообщение CPL_DBLCLK запускает блокнот. Код можно легко изменить, чтобы отображалась форма или диалоговое окошко. Этот код можно компилировать как под платформу Win32, так и под Win16.
Чтобы скомпилировать проект, необходимо из вышеприведённого файла .rc создать два: TCPL32.RES и TCPL16.RES.
library TestCpl;
uses
{$IFDEF WIN32}
 Windows,
{$ELSE}
 WinTypes, WinProcs,
{$ENDIF}
 SysUtils, Messages;
{$IFDEF WIN32}
 {$R TCPL32.RES}
{$ELSE}
 {$R TCPL16.RES}
{$ENDIF}
const
 NUM_APPLETS = 1;
{$IFDEF WIN32}
 CPL_DYNAMIC_RES = 0;
{$ENDIF}
 CPL_INIT = 1;
 CPL_GETCOUNT = 2;
 CPL_INQUIRE = 3;
 CPL_SELECT = 4;
 CPL_DBLCLK = 5;
 CPL_STOP = 6;
 CPL_EXIT = 7;
 CPL_NEWINQUIRE = 8;
{$IFDEF WIN32}
 CPL_STARTWPARMS = 9;
{$ENDIF}
 CPL_SETUP = 200;
{$IFNDEF WIN32}
type
 DWORD = longint;
{$ENDIF}
type
 TCplInfo = record
 idIcon: integer;
 idName: integer;
 idInfo: integer;
 lData: longint;
 end;
 PCplInfo = ^TCplInfo;
type
 TNewCplInfoA = record
 dwSize: DWORD;
 dwFlags: DWORD;
 dwHelpContext: DWORD;
 lData: longint;
 IconH: HIcon;
 szName: array [0..31] of char;
 szInfo: array [0..63] of char;
 szHelpFile: array [0..127] of char;
 end;
 PNewCplInfoA = ^TNewCplInfoA;
{$IFDEF WIN32}
type
 TNewCplInfoW = record
 dwSize: DWORD;
 dwFlags: DWORD;
 dwHelpContext: DWORD;
 lData: longint;
 IconH: HIcon;
 szName: array [0..31] of WChar;
 szInfo: array [0..63] of WChar;
 szHelpFile: array [0..127] of WChar;
 end;
 PNewCplInfoW = ^TNewCplInfoW;
{$ENDIF}
type
 TNewCplInfo = TNewCplInfoA;
 PNewCplInfo = ^TNewCplInfoA;
function CPlApplet(hWndCPL: hWnd; iMEssage: Integer;
 lParam1: longint; lParam2: longint): longint
{$IFDEF WIN32} stdcall; {$ELSE} ; export; {$ENDIF}
begin
 case iMessage of
 CPL_INIT:
 begin
 Result := 1;
 exit;
 end;
 CPL_GetCount:
 begin
 Result := NUM_APPLETS;
 exit;
 end;
 CPL_Inquire:
 begin
 PCplInfo(lParam2)^.idIcon := 2;
 PCplInfo(lParam2)^.idName := 1;
 PCplInfo(lParam2)^.idInfo := 2;
 PCplInfo(lParam2)^.lData := 0;
 Result := 1;
 exit;
 end;
 CPL_NewInquire:
 begin
 PNewCplInfo(lParam2)^.dwSize := sizeof(TNewCplInfo);
 PNewCplInfo(lParam2)^.dwHelpContext := 0;
 PNewCplInfo(lParam2)^.lData := 0;
 PNewCplInfo(lParam2)^.IconH :=
 LoadIcon(hInstance, MakeIntResource(2));
 lStrCpy(@PNewCplInfo(lParam2)^.szName, 'TestCPL');
 lStrCpy(PNewCplInfo(lParam2)^.szInfo, 'My Test CPL');
 PNewCplInfo(lParam2)^.szHelpFile[0] := #0;
 Result := 1;
 exit;
 end;
 CPL_SELECT:
 begin
 Result := 0;
 exit;
 end;
 CPL_DBLCLK:
 begin
 WinExec('Notepad.exe', SW_SHOWNORMAL);
 Result := 1;
 exit;
 end;
 CPL_STOP:
 begin
 Result := 0;
 exit;
 end;
 CPL_EXIT:
 begin
 Result := 0;
 exit;
 end
 else
 begin
 Result := 0;
 exit;
 end;
 end;
end;
exports CPlApplet Name 'CPlApplet';
begin
end.
Source: Взято из http://forum.sources.ru
ID: 01869