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

Ваш аккаунт

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

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

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

поддержка плагинов (DLL)

2.6K
10 ноября 2006 года
sql-injection
46 / / 22.03.2005
как можно динамически подключть DLL. (прикол, динамически подключть динамичаски подключаемую библеотеку =))
497
10 ноября 2006 года
IL84
267 / / 24.04.2003
LoadLibrary, GetProcAddress.
257
10 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
и FreeLibrary потом обязательно, т.е. когда с длл отработаешь и она больше не нужна станет.
2.6K
11 ноября 2006 года
sql-injection
46 / / 22.03.2005
так... длл вызвал.... а как теперь вызвать из неё метод? поподробнее, пжалста.
302
11 ноября 2006 года
Sagittarius
648 / / 12.04.2003
[QUOTE=sql-injection]так... длл вызвал.... а как теперь вызвать из неё метод? поподробнее, пжалста.[/QUOTE]
Код:
type
  TProc = function(Message:PChar): Integer;

var
  h: THandle;
  proc: TProc;

begin
  h := LoadLibrary( 'MyPlugin.dll' );
  if h <> INVALID_HANDLE_VALUE then
  begin
    proc := GetProcAddress( h, 'MyProc' );
    if @proc <> Nil then
    begin
      proc( 'Hello World!' );
    end;
    FreeLibrary( h );
  end;
end;
387
15 ноября 2006 года
Ihbif19
421 / / 28.10.2004
[QUOTE=Sagittarius]
Код:
type
  TProc = function(Message:PChar): Integer;

var
  h: THandle;
  proc: TProc;

begin
  h := LoadLibrary( 'MyPlugin.dll' );
  if h <> INVALID_HANDLE_VALUE then
  begin
    proc := GetProcAddress( h, 'MyProc' );
    if @proc <> Nil then
    begin
      proc( 'Hello World!' );
    end;
    FreeLibrary( h );
  end;
end;
[/QUOTE]
А как быть, если неизвестно имя функции в DLL???
257
15 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
[quote=Ihbif17]А как быть, если неизвестно имя функции в DLL???[/quote]
если уж мы рассматриваем поддержку плагинов, то имя процедуры или функции определяет человек, который написал программу, а не те кто пишет для неё плагины, соответственно его прога будет знать опред. имя вызываемой функции/процедуры, будет sdk и те кто хочет добавить примочку к программе могут писать плагин опираясь на sdk и называть функции так как написано в sdk, поэтому код самое то.
2.6K
17 ноября 2006 года
sql-injection
46 / / 22.03.2005
слушайте... чота, блин, не работает.... выдеёт исключение (ошибка ввода-вывода)... что делать?
257
17 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
опиши поподробнее, что ты делал, т.е. какую функцию/процедуру вызывал из какой дллшки и т.д. кстати вот код, показывающий как из user32.dll можно вызвать функцию MessageBox:
Код:
var MyMsgBox:function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;stdcall;
hLib:DWORD;
begin
hLib := LoadLibrary('user32.dll');
  if hLib <> INVALID_HANDLE_VALUE then
  begin
    MyMsgBox:= GetProcAddress( hLib, 'MessageBoxA' );
    if @MyMsgBox <> Nil then
    begin
      MyMsgBox(0,'','',0 );
    end;
    FreeLibrary( hLib );
  end;
end;

просто решил показать на уже существующей длл.
2.6K
19 ноября 2006 года
sql-injection
46 / / 22.03.2005
делал всё как в исходнике.
описал функцию, загрузил длл, а как пытаюсь вызвать метод - ашыпка.
вот исходник
Код:
type
  TProc = function:TStrings;

var
  hLib: THandle;
  AboutEx: TProc;

procedure TForm2.Button1Click(Sender: TObject);
begin
with OpenDialog1 do
if execute then edit1.Text:=filename;
end;

procedure TForm2.Button2Click(Sender: TObject);
begin
if fileexists(edit1.Text) then
begin
  hlib := LoadLibrary(PChar(Edit1.Text));
  if hlib <> INVALID_HANDLE_VALUE then
  begin
    AboutEx := GetProcAddress( hlib, 'AboutEx' );
    if @AboutEx <> Nil then
    begin
      ListBox1.Items:=AboutEx;
    end
    else MessageDlg('В данном файле нет метода AboutEx. Плохая библиотека =(',mtError,[mbOk],0);
  FreeLibrary(hlib);
  end
  else MessageDlg('Неверный Handle. Плохая библиотека =(',mtError,[mbOk],0);
end
else MessageDlg('Нет такого файла =(',mtError,[mbOk],0);
end;
257
19 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
а длл твоя? попробуй еще вот так:
 
Код:
type
  TProc = function:TStrings;stdcall;
302
20 ноября 2006 года
Sagittarius
648 / / 12.04.2003
С пакетами исполнения компилировал и DLL и EXE? Если без пакетов, то такой код работать не будет, так как TStrings в EXE и TStrings в DLL - это разные вещи.

Если хочешь, можешь возвращать из DLL вместо TStrings строку типа PChar, которая равна TStrings.DelimitedText. А уже в EXE преобразовывать ее обратно в TStrings.
2.6K
20 ноября 2006 года
sql-injection
46 / / 22.03.2005
[QUOTE=kosfiz]а длл твоя? попробуй еще вот так:
 
Код:
type
  TProc = function:TStrings;stdcall;
[/QUOTE]
пробовал - не пашет (ошибка при обращении по нулевому указателю) =(
2.6K
20 ноября 2006 года
sql-injection
46 / / 22.03.2005
[QUOTE=Sagittarius]С пакетами исполнения компилировал и DLL и EXE? Если без пакетов, то такой код работать не будет, так как TStrings в EXE и TStrings в DLL - это разные вещи.

Если хочешь, можешь возвращать из DLL вместо TStrings строку типа PChar, которая равна TStrings.DelimitedText. А уже в EXE преобразовывать ее обратно в TStrings.[/QUOTE]
с пакетами всё в норме.
497
20 ноября 2006 года
IL84
267 / / 24.04.2003
Выдрано из моего рабочего проекта. Работает 100%.

В основной программе:
Код:
unit myunit;

interface
uses
  Windows, Classes, Messages, SysUtils;

type
  TFunc = procedure(); stdcall;

var
  myfunc : TFunc;

implementation

procedure TForm1.LoadLib();
begin
hlib := LoadLibrary(PChar('mylib.dll'));
if hlib <> INVALID_HANDLE_VALUE then
  begin
    @myfunc := GetProcAddress( hlib, 'exportfunc' );//обратить внимание на знак @
    if Assigned(myfunc) <> Nil then
      begin
        myfunc();
      end
    else
      ShowMessage('облом');
    FreeLibrary(hlib);
  end
  else
    ShowMessage('облом');
end;


В библиотеке:
Код:
library mylib;
uses
    Windows;

procedure exportfunc();
begin
 MessageBox(0,'Hello world!!!','Message',MB_OK);
end;

exports
    exportfunc;
end.
257
21 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
sql-injection
надо длл посмотреть. можно код или уже готовую.
2.6K
21 ноября 2006 года
sql-injection
46 / / 22.03.2005
а в конце кода длл надо писать exports и т.д. (я написал) ?
286
21 ноября 2006 года
misha_turist
572 / / 28.11.2005
Цитата: kosfiz
опиши поподробнее, что ты делал, т.е. какую функцию/процедуру вызывал из какой дллшки и т.д. кстати вот код, показывающий как из user32.dll можно вызвать функцию MessageBox:
Код:
var MyMsgBox:function(hWnd: HWND; lpText, lpCaption: PChar; uType: UINT): Integer;stdcall;
hLib:DWORD;
begin
hLib := LoadLibrary('user32.dll');
  if hLib <> INVALID_HANDLE_VALUE then
  begin
    MyMsgBox:= GetProcAddress( hLib, 'MessageBoxA' );
    if @MyMsgBox <> Nil then
    begin
      MyMsgBox(0,'','',0 );
    end;
    FreeLibrary( hLib );
  end;
end;

просто решил показать на уже существующей длл.



Извеняюсь, что не в тему. )))

А почему именно "MessageBoxA", а не "MessageBox" или "MessageBoxB" (они в user32.dll помойму есть...)?

19K
21 ноября 2006 года
Релорт
17 / / 14.09.2006
В Windows API многие функции встречается в 2-х экземплярах: ANSI и UNICODE. Первые обозначаются суффиксом A, вторые – суффиксом W.
Например, MessageBoxA - ansi версия, MessageBoxW - соответственно unicode версия. И где ты там MessageBoxB нашёл? :) Хотя мона импортировать и MessageBox вроде... :)
257
21 ноября 2006 года
kosfiz
1.6K / / 18.09.2005
sql-injection
[quote=sql-injection]а в конце кода длл надо писать exports и т.д. (я написал) ?[/quote]
конечно надо.
misha_turist
вот часть ответа на вопрос:
[quote=Релорт]В Windows API многие функции встречается в 2-х экземплярах: ANSI и UNICODE. Первые обозначаются суффиксом A, вторые &#8211; суффиксом W.
Например, MessageBoxA - ansi версия, MessageBoxW - соответственно unicode версия.[/quote]
а теперь про:
[quote=misha_turist]а не "MessageBox" или "MessageBoxB" (они в user32.dll помойму есть...)?[/quote]
нет, таких функций там нету, посмотри таблицу экспорта user32.dll(воспользуйся PEiD'ом или еще чем-нить).
286
22 ноября 2006 года
misha_turist
572 / / 28.11.2005
Цитата: kosfiz
нет, таких функций там нету, посмотри таблицу экспорта user32.dll(воспользуйся PEiD'ом или еще чем-нить).



Я уже понял, я просто не помнил точно с какими на конце буквами я подобные функции видел.))

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