На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Работа с DLL
      Здесь будут рассматриваться вопросы по работе с динамическими библиотеками.
        Как загрузить DLL и вызвать из нее функцию?

        Нижеприведенный код загружает DLL в память, вызывает из нее функцию и выгружает DLL.
        ExpandedWrap disabled
          type
            TMyProc = procedure(const N: Integer); stdcall;
           
          procedure TForm1.Button1Click(Sender: TObject);
          var
            MyProc: TMyProc;
            Lib: THandle;
            DLLName: string;
          begin
            DLLName := 'mydll.dll';
            if FileExists(DLLName) then
            begin
              Lib := LoadLibrary(PChar(DLLName));
              if Lib < HINSTANCE_ERROR then
                Win32Check(False);
                // или
                // ShowMessage('Не удалось загрузить библиотеку ' + DLLName);
           
              try
                MyProc := GetProcAddress(Lib, 'MyProc');
                if Assigned(MyProc) then
                  MyProc(123);
              finally
                FreeLibrary(Lib);
              end;
            end;
          end;
          Статическое подключение функций из DLL
          Итак, например вы создали DLL, в которой хранится набор математических функций.
          Те функции, которые вы собираетесь передовать в прогу, надо записать в разделе exports, в коде вашей DLL.
          Например :
          ExpandedWrap disabled
            library Project2;
            uses
              SysUtils,
              Classes;
             
            {$R *.res}
             
            function MyFunction(параметры): значение ;
            begin
            .......................
            end;
             
            exports MyFunction; //Экспортируем функции, процедуры и т.п.
             
            begin
            end.

          Компилируем библиотеку.
          А теперь открываем исходник вашей проги и в разделе INTERFACE записываем загружаемые функции.

          Способы загрузки экспортируемых функций

          1) Самый простой :
          ExpandedWrap disabled
            Function MyFunction(параметры) : значение; //Обьявляем функцию
            external 'MyDll.dll'; //Название вашей DLL

          2) По имени :
          ExpandedWrap disabled
            Function MyFunction(параметры) : значение; //Обьявляем функцию
            external 'MyDll.dll' name 'MyFunction'; //Название вашей DLL, name -  имя экспортируемой функции

          3) По индексу :
          ExpandedWrap disabled
            Function MyFunction(параметры) : значение; //Обьявляем функцию
            external 'MyDll.dll' index 1; //Название вашей DLL, index - индекс функции внутри DLL

          Не забудьте, что конструкцию
          ExpandedWrap disabled
            external 'MyDll.dll';

          надо писать, после каждой экспортируемой функции, иначе появится ошибка,о том что функции не обьявлены :(
          Конец - кидаем DLL в папку с проектом и запускаем сам проект :D
          В архиве лежит нескомпилированный исходник всех трех примеров(прога+ДЛЛ)

          Это сообщение было перенесено сюда или объединено из темы "Dll в памяти,"
          Прикреплённый файлПрикреплённый файл______.rar (10.27 Кбайт, скачиваний: 255)
          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
          0 пользователей:


          Рейтинг@Mail.ru
          [ Script execution time: 0,0255 ]   [ 17 queries used ]   [ Generated: 28.03.24, 14:32 GMT ]