Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Программа и интерфейс
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 20.01.2008, 16:24
miae miae вне форума
Прохожий
 
Регистрация: 20.01.2008
Сообщения: 1
Репутация: 10
Вопрос Динамическая загрузка DLL

Имею следующее. Библиотека, которая должна загружаться автоматически.
Код:
library pcInfo;

uses
  SysUtils,
  Classes, Windows;

function GetSysInfo: PChar; stdcall;
var
    Size         : Cardinal;
    PRes         : PChar;
    ORes         : String;
begin
// Имя компьютера
Size := MAX_COMPUTERNAME_LENGTH + 1;
PRes := StrAlloc(Size);
If GetComputerName(PRes, Size) Then  ORes:=StrPas(PRes);
Result:= PChar(ORes);
end;
exports GetSysInfo;
begin
end

Ну и собственно программу, для динамического вызова библиотеки.
Код:
type
  TFunction = function : PChar;

  DLLFunction: TFunction;

implementation

{$R *.dfm}

Function ExecDLLFunction(DLLName : PChar; FunctionName : PChar) : PChar;
var
  hndDLLHandle: THandle;
  DLLFunction: TFunction;
begin
  try
    // загружаем dll динамически
    hndDLLHandle := loadLibrary ( DLLName );
    if hndDLLHandle <> 0 then
    begin
      // получаем адрес функции
      @DLLFunction := getProcAddress ( hndDLLHandle, FunctionName );
      // если адрес функции найден
      if addr ( DLLFunction ) <> nil then
      begin
        Result := DLLFunction;
      end
      else
        // DLL не найдена ("handleable")
        showMessage ( 'Function not exists...' );
    end
    else
      // DLL не найдена ("handleable")
      showMessage ( 'DLL not found...' );

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

Function ExecDLLFunction1(DLLName : PChar; FunctionName : PChar) : PChar;
var
  hndDLLHandle: THandle;
begin
    @DLLFunction :=nil;
    hndDLLHandle := loadLibrary ( DLLName );
    if hndDLLHandle >= 32 then
      begin
        @DLLFunction := getProcAddress(hndDLLHandle, FunctionName);
      if @DLLFunction <> nil then
      begin
        Result := DLLFunction;
      end;
    freeLibrary ( hndDLLHandle );
  end;
end;

Memo1.Lines.Add(ExecDLLFunction1('pcinfo.dll','GetSysInfo'));

Так вот оба способа загрузки DLL и вызова процедуры выдает ошибку при выходе. В чем причина ???

Есть ли нормальный работающий пример по динамической загрузке библиотек и вызове процедур.
Ответить с цитированием
  #2  
Старый 20.01.2008, 19:51
Аватар для The Shadow
The Shadow The Shadow вне форума
Продвинутый
 
Регистрация: 11.06.2007
Адрес: Уфа, Россия
Сообщения: 793
Репутация: 35
По умолчанию

Посмотри вот тут
__________________
Что делать, когда сломался комп:
1. Если вы юзер - делать ноги.
2. Если ремонтник - делать деньги.
3. Если вы программист - делать вид, что так было задумано.
Ответить с цитированием
  #3  
Старый 22.01.2008, 01:08
Аватар для zip000
zip000 zip000 вне форума
Начинающий
 
Регистрация: 24.07.2007
Сообщения: 194
Репутация: 25
По умолчанию

miae Знач так
1)
Код:
type
  TFunction = function : PChar; stdcall;

  DLLFunction: TFunction;
2) ты в качестве результата функции (та которая в ДЛЛ) передаешь указатель на локальную переменную Pres, а это не правильно. Сделай переменную эту глобальной и все должно заработать.
__________________
Не профи, но и не чайник . D6 - лучше не придумали. Пока.
Ответить с цитированием
Ответ


Delphi Sources

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

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 06:51.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter