Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

LoadLibrary из ресурса

330
10 августа 2012 года
kastron
215 / / 17.09.2006
Всем привет! Подскажите пожалуйста. В ресурсе, подключенному к проекту есть DLL. Возможно ли каким-то образом выполнить LoadLibrary для DLL, находящейся в ресурсе!? Спасибо.
277
10 августа 2012 года
arrjj
1.7K / / 26.01.2011
Угу, сохранить ресурс на диск и загрузить через LoadLibrary
1
10 августа 2012 года
kot_
7.3K / / 20.01.2000
необходимо выгрузить ее во временный файл (или выполнить меппинг)
7
10 августа 2012 года
@pixo $oft
3.4K / / 20.09.2006
Есть ещё res://-протокол,но не уверен,что он подойдёт для данной задачи(но может подойти для чего-то ещё,близкого по теме)
330
10 августа 2012 года
kastron
215 / / 17.09.2006
сохранять из ресурсов а потом грузить с диска не совсем уместно. интересует именно загрузка DLL из памяти и установка хука. В принципе, с загрузкой DLL из ресурса в память уже разобрался. Но возник другой вопрос. В SetWindowHookEX один из передаваемых параметров Hmod. Скажите пожалуйста, возможно ли его получить другим образом (именно из памяти), а не через LoadLibrary (с указанием пути к DLL)
7
10 августа 2012 года
@pixo $oft
3.4K / / 20.09.2006
Ну куда отмапал,там и будет значение.Это ж базовый адрес загрузки модуля
330
13 августа 2012 года
kastron
215 / / 17.09.2006
Так я загружаю DLL из ресурсов:

Код:
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, BTMemoryModule;

  type TShp = procedure (hk: HHOOK) stdcall;

type
  TForm1 = class(TForm)
    Load_Button: TButton;
    do_button: TButton;
    procedure Load_ButtonClick(Sender: TObject);
    procedure do_buttonClick(Sender: TObject);
  private
    { Private declarations }
public
  m_DllDataSize:int64;
  mp_DllData:Pointer;

procedure TForm1.Load_ButtonClick(Sender: TObject);
var
   ms : TMemoryStream;
   rs : TResourceStream;
begin
   if 0 <> FindResource(hInstance, 'SPDLL', RT_RCDATA) then
   begin
     rs := TResourceStream.Create(hInstance, 'SPDLL', RT_RCDATA);
     ms := TMemoryStream.Create;
     try
       ms.LoadFromStream(rs);
       ms.Position := 0;
       m_DllDataSize := ms.Size;
       mp_DllData := GetMemory(m_DllDataSize);
       ms.Read(mp_DllData^, m_DllDataSize);
     finally
       ms.Free;
       rs.Free;
     end;
   end;
end;
Так пытаюсь поставить хук из длл, загруженной в память

Код:
procedure TForm1.do_buttonClick(Sender: TObject);
var
   btMM: PBTMemoryModule;
   m_TestCallstd:Pointer;
   p: pointer;
   sh: TShp;
   hk: HHOOK;
   h:THandle;
begin
   btMM := BTMemoryLoadLibary(mp_DllData, m_DllDataSize);
   h:=THandle(btMM.codeBase);
   try
     if btMM = nil then Abort;
     p := BTMemoryGetProcAddress(btMM, 'HookProc');
     @sh:=BTMemoryGetProcAddress(btMM, 'SetHK');
     if ((p=nil) or (@sh=nil)) then
        begin
             MessageBox(0, PAnsiChar('Библиотека не содержит необходимых процедур!'),
                           0, MB_OK+MB_ICONERROR);
             exit;
        end;
     hk:=SetWindowsHookEx(WH_CALLWNDPROC, p, h, 0);
     if hk=0 then
        begin
             MessageBox(0, PAnsiChar('Невозможно установить ловушку!'),
                           0, MB_OK+MB_ICONERROR);
             FreeLibrary(h);
             exit;
        end;  
     sh(hk);
     MessageBox(0, 'Ловушка установлена! Нажмите OK для снятия.',
                   0, MB_OK);
     UnhookWindowsHookEx(hk);
     FreeLibrary(h);
   except
     Showmessage('Ошибка загрузки DLL: ' + BTMemoryGetLastError);
   end;
   if Assigned(btMM) then BTMemoryFreeLibrary(btMM);
 end;
hk равна нулю, то есть хук не устанавливается... Помогите пожалуйста разобраться, что я делаю не так?

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог