Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2013.09.22;
Скачать: CL | DM;

Вниз

Как правильно вызвать метод класса из CallBack функции   Найти похожие ветки 

 
denkop   (2011-08-26 17:47) [0]

Есть такой код, задача которого в FResNames получить список имён ресурсов:
unit Unit1;

interface

uses Classes, Windows, SysUtils, ExtCtrls;

type

 TResContainer = class
 private
   FResNames: TStringList;

   procedure AddResName(ResName: string);
 public
   constructor Create;
   destructor Destroy;
 end;

implementation

function EnumResourceNamesCallback(hModule: HMODULE; lpType, lpName: PAnsiChar; lParam: Longint): BOOL; stdcall;
var
 ResName: string;
begin
 if (Cardinal(lpName) shr 16) = 0 then ResName:=IntToStr(Integer(lpName))
 else ResName:=lpName;

 // вот здесь как то нужно вызвать метод AddResName(ResName);

 Result := True;
end;

constructor TResContainer.Create;
var
 aResInstance: THandle;
begin
 FResNames:=TStringList.Create;

 aResInstance := FindResourceHInstance (HInstance);

 if not EnumResourceNames(aResInstance, RT_RCDATA, @EnumResourceNamesCallback, 0) then
   RaiseLastOSError;

 FResNames.SaveToFile("d:\111.txt");
end;

destructor TResContainer.Destroy;
begin
 FResNames.Free;
end;

procedure TResContainer.AddResName(ResName: string);
begin
 FResNames.Add(ResName);
end;

end.

Проблема в том, как обратиться из callback функции к методу или свойству класса? Или по другому вопрос можно поставить, как передать в качестве callback функции метод класса?


 
_Юрий   (2011-08-26 17:53) [1]

в EnumResourceNames последним параметром передать указатель на экземпляр

EnumResourceNames(aResInstance, RT_RCDATA,
@EnumResourceNamesCallback, Longint(self))

в калл-беке использовать

function EnumResourceNamesCallback(hModule: HMODULE; lpType, lpName: PAnsiChar; lParam: Longint): BOOL; stdcall;
var
ResName: string;
container: TResContainer;
begin

container := TResContainer(lParam);


 
_Юрий   (2011-08-26 18:02) [2]

Также у вас в коде потенциальная проблема с деструктором:

destructor Destroy; override;

в противном случае ваш деструктор не будет вызван при освобождении объекта TResContainer методом Free, и вы получите утечку памяти


 
denkop   (2011-08-26 18:10) [3]

Спасибо большое!



Страницы: 1 вся ветка

Текущий архив: 2013.09.22;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.006 c
8-1232828242
Vemer
2009-01-24 23:17
2013.09.22
Как быстро нарисовать точки из массива в Canvas/DC?


15-1365770544
O'ShinW
2013-04-12 16:42
2013.09.22
Oracle. Почему так заводится юзер?


2-1357650272
Pcrepair
2013-01-08 17:04
2013.09.22
Как правильно из потока менять Переменные в другом потоке?


1-1314366462
denkop
2011-08-26 17:47
2013.09.22
Как правильно вызвать метод класса из CallBack функции


15-1365671938
ВВВ
2013-04-11 13:18
2013.09.22
Про видеокарту.