Вниз
Скачать: 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 вся ветка

Скачать: CL | DM;



Память: 0.45 MB
Время: 0.003 c
2-1357713143
Crusader
2013-01-09 10:32
2013.09.22
очистка StringList


2-1357514076
Pcrepair
2013-01-07 03:14
2013.09.22
Загрузчик на idHTTP зависает при загрузке страниц


15-1365676462
Bob
2013-04-11 14:34
2013.09.22
TColor и RGB - где правда в жизни ?


2-1357143710
lamer6666
2013-01-02 20:21
2013.09.22
Визуализация занятости приложения.


15-1365670567
Dmitry1987
2013-04-11 12:56
2013.09.22
покупка Verisign




   Наверх