Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.12.2007, 20:10   #1
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию Как "динамически" использовать "DLL"

Нужно "динамически" загрузить DLL в приложение, не подключая его на прямую.

Var
function VersionInfo:string; external 'msVer.dll';
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 10.12.2007, 20:46   #2
rpy3uH
добрый няша
Старожил
 
Аватар для rpy3uH
 
Регистрация: 29.10.2006
Сообщений: 4,804
По умолчанию

Код:
type
  tf= function:string;

procedure TForm1.Button1Click(Sender: TObject);

var
  p:pointer;
  pr:tf;
begin
  p:=GetProcAddress(LoadLibrary('путь к библиотеке'),'VersionInfo');
  pr:=tf(p);
  pr;
end;
P.S. сам не проверял.
rpy3uH вне форума Ответить с цитированием
Старый 11.12.2007, 00:37   #3
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Результат "Invalid pointer operation", а что за данные хранит тип "pointer" ?
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Старый 11.12.2007, 00:54   #4
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
По умолчанию

Приер динам. загрузки:

Создадим простую библиотеку DLL:
Код:
{Project file name: c:\example\exdouble\exdouble.dpr}

library ExDouble;
// my simple dll

function calc_double(r: real): real; stdcall;
begin
  result := r * 2;
end;

exports
  calc_double index 1;

end;
Динамическая загрузка DLL:
Код:
unit untMain;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  Tcalc_double = function ( r: real ): real;

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.Button1Click(Sender: TObject);
var
  hndDLLHandle: THandle;
  calc_double: Tcalc_double;
begin
  try
    // загружаем dll динамически
    hndDLLHandle := loadLibrary ( 'ExDouble.dll' );

    if hndDLLHandle <> 0 then
    begin

      // получаем адрес функции
      @calc_double := getProcAddress ( hndDLLHandle, 'calc_double' );

      // если адрес функции найден
      if addr ( calc_double ) <> nil then
      begin
        // показываем результат ( 21...)
        showMessage ( floatToStr ( calc_double ( 10.5 ) ) );
      end
      else
        // DLL не найдена ("handleable")
        showMessage ( 'Function not exists...' );

    end
    else
      // DLL не найдена ("handleable")
      showMessage ( 'DLL not found...' );

  finally
    // liberar
    freeLibrary ( hndDLLHandle );
  end;
end;

end.
_______________________________
Смотрите DelphiWorld
Alter вне форума Ответить с цитированием
Старый 11.12.2007, 15:24   #5
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Спасибо большое за код, но если Вас не затруднит, почему этот метод не работает со строками и массивами?
P.S. Без ошибок.
P.S. Хотя всё нормально , я поставил обработчик ошибок, благорарю за помошь.
Всё гениальное - просто!

Последний раз редактировалось Air; 11.12.2007 в 15:54.
Air вне форума Ответить с цитированием
Старый 11.12.2007, 16:32   #6
bill
Форумчанин
 
Аватар для bill
 
Регистрация: 26.04.2007
Сообщений: 440
По умолчанию

Цитата:
Сообщение от Air Посмотреть сообщение
Спасибо большое за код, но если Вас не затруднит, почему этот метод не работает со строками и массивами?
Если функция передает строки, то нужно подключать модуль sharemem, который позволяет корректно работать со строками. Также как вариант- перевести строки к типу pchar, что значительно проще и не нужны доп. модули.
bill вне форума Ответить с цитированием
Старый 11.12.2007, 17:47   #7
Alter
Старожил
 
Аватар для Alter
 
Регистрация: 06.08.2007
Сообщений: 2,239
Сообщение

Цитата:
Сообщение от Air Посмотреть сообщение
Спасибо большое за код, но если Вас не затруднит, почему этот метод не работает со строками и массивами?
P.S. Без ошибок.
P.S. Хотя всё нормально , я поставил обработчик ошибок, благорарю за помошь.
В DLL НАДО использовать тип PChar, т.к при использовании типа STRING возникают ошибки с памятью.
Пример перевода форматов:
Код:
Var P :Array[0..255]of char;
     S :String;
begin
 S := 'Menu';
  P := PChar( S ); // String -> PChar
 S := Strring( P ); // PChar -> String
end;
Alter вне форума Ответить с цитированием
Старый 11.12.2007, 21:55   #8
Air
Участник клуба
 
Аватар для Air
 
Регистрация: 30.04.2007
Сообщений: 1,307
По умолчанию

Ясно, спасибо всем.
Всё гениальное - просто!
Air вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при использовании OlePropertyGet("Documents").OleProcedure("Add") в C++ Builder AleksP C++ Builder 7 11.04.2009 13:06
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51
Excel файл открывается не "до конца" (странички "не показываются" только серое поле) Dorvir Microsoft Office Excel 2 28.03.2008 10:03
Создаю диаграмму "Bar". Подскажите как убрать растояние между "столбами" MAcK Компоненты Delphi 11 24.10.2007 10:49