C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Как получит список зарегистрированых классов, Зар. с помощью RegisterClass
Termi_uc
Отправлено: 14.02.2007, 19:28


Дежурный стрелочник

Группа: Участник
Сообщений: 61



Как получит список зарегистрированых с помощью функции RegisterClass, классов???

Например:
CODE

RegisterClass(__classid(TButton));
RegisterClass(__classid(TPanel));

и как теперь получить список где будут, все зарегистрированые до этого классы, а в конце эти два.

Здесь раньше написано было RegisterClass("TButton"); — бес попутал, а сам удивлялся — что никто не знает?

Отредактировано Termi_uc — 19.02.2007, 20:24
Termi_uc
  Отправлено: 20.02.2007, 19:54


Дежурный стрелочник

Группа: Участник
Сообщений: 61



Если RegisterClass это Win32 API, то значит и функция для получения зарегестрированых классов должнабыть Win32 API. Но я чё-то не нашел.

Может вообще невозможно получить список зарегестрированых классов? sad.gif
AVC
Отправлено: 21.02.2007, 09:35


Ветеран

Группа: Модератор
Сообщений: 1583



Windows
CODE

RegisterClass Function

--------------------------------------------------------------------------------


The RegisterClass function registers a window class for subsequent use in calls to the CreateWindow or CreateWindowEx function.

The RegisterClass function has been superseded by the RegisterClassEx function. You can still use RegisterClass, however, if you do not need to set the class small icon.


Syntax

ATOM RegisterClass(          CONST WNDCLASS *lpWndClass
);
Parameters

lpWndClass
[in] Pointer to a WNDCLASS structure. You must fill the structure with the appropriate class attributes before passing it to the function.
Return Value

If the function succeeds, the return value is a class atom that uniquely identifies the class being registered. This atom can only be used by the CreateWindow, CreateWindowEx, GetClassInfo, GetClassInfoEx, FindWindow, FindWindowEx, and UnregisterClass functions and the IActiveIMMap::FilterClientWindows method.

If the function fails, the return value is zero. To get extended error information, call GetLastError.




Remarks

If you register the window class by using RegisterClassA, the application tells the system that the windows of the created class expect messages with text or character parameters to use the ANSI character set; if you register it by using RegisterClassW, the application requests that the system pass text parameters of messages as Unicode. The IsWindowUnicode function enables applications to query the nature of each window. For more information on ANSI and Unicode functions, see Conventions for Function Prototypes.

All window classes that an application registers are unregistered when it terminates.

Windows 95/98/Me: All window classes registered by a dynamic-link library (DLL) are unregistered when the DLL is unloaded.

Windows NT/2000/XP: No window classes registered by a DLL are unregistered when the DLL is unloaded. A DLL must explicitly unregister its classes when it is unloaded.

Windows 95/98/Me: RegisterClass fails if the cbWndExtra or cbClsExtra member of the WNDCLASS structure contains more than 40 bytes.

Windows 95/98/Me: RegisterClassW is supported by the Microsoft Layer for Unicode (MSLU). To use this version, you must add certain files to your application, as outlined in Microsoft Layer for Unicode on Windows 95/98/Me Systems.

Example

For an example, see Associating a Window Procedure with a Window Class.

Function Information

Minimum DLL Version user32.dll
Header Declared in Winuser.h, include Windows.h
Import library User32.lib
Minimum operating systems Windows 95, Windows NT 3.1
Unicode Implemented as ANSI and Unicode versions.  

See Also

Window Classes Overview, CreateWindow, CreateWindowEx, FindWindow, FindWindowEx, GetClassInfo, GetClassInfoEx, GetClassName, RegisterClassEx, UnregisterClass, WindowProc, WNDCLASS

--------------------------------------------------------------------------------

© 2005 Microsoft Corporation. All rights reserved.



VCL
CODE

// classes.pas
procedure RegisterClass(AClass: TPersistentClass);
var
 AClassName: string;
begin
 with ClassList.LockList do
 try
   while IndexOf(AClass) = -1 do
   begin
     AClassName := AClass.ClassName;
     if GetClass(AClassName) <> nil then
       raise EFilerError.CreateResFmt(@SDuplicateClass, [AClassName]);
     Add(AClass);
     if AClass = TPersistent then Break;
     AClass := TPersistentClass(AClass.ClassParent);
   end;
 finally
   ClassList.UnlockList;
 end;
end;
Termi_uc
Отправлено: 21.02.2007, 15:36


Дежурный стрелочник

Группа: Участник
Сообщений: 61



QUOTE (AVC @ 21.02.2007, 09:35)

// classes.pas
procedure RegisterClass(AClass: TPersistentClass);
var
AClassName: string;
begin
with ClassList.LockList do
try
....
finally
  ClassList.UnlockList;
end;
end;

Я так понимаю ты предлагаеш создать экземпляр TClassList в своей прграмме. Потом перегрузить функцию RegisterClass и просто в ClassList записывать регистрируемые в программе классы.
Но это не совсем то, что я спрашивал.

Всё понял
CODE
RegisterClass(__classid(TForm1));// — не Win32 API
::RegisterClass((tagWNDCLASSA *)__classid(TForm1));// — Win32 API

Извините, спутал ::RegisterClass с RegisterClass.

буду считать, что получить список зарегистрированых в системе классов нельзя... sad.gif
AVC
Отправлено: 21.02.2007, 16:20


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

буду считать, что получить список зарегистрированых в системе классов нельзя

Ну почему. Не делал, но думаю что EnumWindows в сочетании с GetClassInfo(Ex) позволит вам обойти все классы, зарегистрированные в системе на данный момент.
Termi_uc
  Отправлено: 21.02.2007, 17:06


Дежурный стрелочник

Группа: Участник
Сообщений: 61



QUOTE (AVC @ 21.02.2007, 16:20)
Ну почему. Не делал, но думаю что EnumWindows в сочетании с GetClassInfo(Ex) позволит вам обойти все классы, зарегистрированные в системе на данный момент.

О...
Я как-то, не подумал
CODE

//Функция собирает информацию об окне и добавляет узел окна в дерево
function AddWindowToTree(wnd: HWND): TTreeNode;
var
caption, classname: String;
text: String;
node: TTreeNode;
begin
//Получение текста окна
SetLength(caption, SendMessage(wnd, WM_GETTEXTLENGTH, 0, 0) + 1);
SetLength(caption, SendMessage(wnd, WM_GETTEXT, Length(caption),
Integer(PAnsiChar(caption))));
//Имя класса окна
SetLength(classname, 1024);
SetLength(classname, GetClassName(wnd, PAnsiChar(classname), 100));

//Формирование текста для элемента и добавление его в дерево
if caption = '' then caption := '<none>';
text := caption + ' [' + classname + ']';
node := enInfo.tree.Items.AddChild( enInfo.parent, text );
node.Data := Pointer(wnd); //Не забываем запомнить дексриптор окна
AddWindowToTree := node;
end;

//Функция вызывается при нахождении нового окна
function NewWindow(wnd: HWND; param: LPARAM):BOOL; stdcall;
var
wndNode, parentNode: TTreeNode;
begin
wndNode := AddWindowToTree(wnd); //Добавление информации об окне в дерево

//Перечисление дочерних окон
parentNode := enInfo.parent;
enInfo.parent := wndNode;
EnumChildWindows(wnd, Addr(NewWindow), param);
enInfo.parent := parentNode;

//Продолжать перечисление (после перечисления всех дочерних окон)
NewWindow := TRUE;
end;


//Процедура формирования дерева (иерархии открытых окон)
procedure TfrmMain.LoadWindowsTree();
var
desktop: TTreeNode;
//enInfo: TEnumInfo;
begin
tree.Items.Clear;
//Добавление узла для Рабочего стола
desktop := tree.Items.Add(tree.Items.GetFirstNode, 'Рабочий стол');
//Перечисление окон
enInfo.tree := tree;
enInfo.parent := desktop;
EnumDesktopWindows(0, Addr(NewWindow), Integer(Addr(enInfo)));
// EnumWindows(Addr(NewWindow), Integer(Addr(enInfo)));
end;
yahoo.gif wizard.gif yu.gif
Решает задачу относительно классов, экземпляры которых созданы...

А если класс зарегистрирован, но его экземпляр (окно) не создано?
Но это уже не по теме.

AVC спасибо!

Тему можно считать ЗАКРЫТОЙ

Отредактировано Termi_uc — 21.02.2007, 17:07

Вернуться в Вопросы программирования в C++Builder