Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Для новичков > Динамическая загрузка DLL


Автор: Allexm 22.11.2010, 20:33
Здравствуйте. Не могу разобраться с вызовом функций из динамически загруженной DLL`ки.

Код.
Программа:
Код

unit main;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}          

const
  DLL_PATH = '..\dll\dll_test.dll';

procedure TForm1.Button1Click(Sender: TObject);
type
  TFunc = function(): string; stdcall;
var
  LDllHandle : THandle;
  LFunc : TFunc;
begin
  LDllHandle := LoadLibrary(DLL_PATH);
  if LDllHandle <> 0 then
    try
      @LFunc := GetProcAddress(LDllHandle, 'getText');
      ShowMessage(LFunc);
    finally
      FreeLibrary(LDllHandle);
    end;
end;

end.

Библиотека:
Код

library dll_test;
uses
  SysUtils, Classes, ShareMem;

{$R *.res}

function getText(): string; StdCall;
begin
  getText := 'Some text';
end;

exports ShowForm, getText;

begin
end.


При нажатии на "Button1", выводится окно с текстом "Some text". А после нажатии на "ОК", вываливается исключение: "Project dll_usage_text.exe raised exception class EInvalidPointer with message 'Invalid pointer operation'. Process stopped." И подсвечивается 44-ая строка. 
Код

FreeLibrary(LDllHandle);


Подскажите, что я делаю не так? Спасибо.

Windows XP SP3
Borland Delphi 7

Автор: ama_kid 22.11.2010, 21:22
строки между dll и приложением можно передавать только shortstring, в смысле string[255], ибо разные менеджеры памяти.

Автор: Allexm 23.11.2010, 09:44
С проблемой разобрался. Поставил библиотеку ShareMem в uses на первое место.

ama_kid, это я знаю, но c библиотекой ShareMem можно и обычный string передавать.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)