Dynamiczne ładowanie DLL i funkcja z parametrami

0

Witam,

Podobny temat pojawił się już ale nie rozwiązał on mojego problemu.
Do konktretów, kod biblioteki:

library testLib;

{ ... long comment... }

uses
  SysUtils,
  Classes,
  Forms,
  frmTest in 'frmTest.pas' {FormTest};

{$R *.res}

function _Test_Form(dbFile : PChar) : integer; stdcall;
begin
   FormTest := TFormTest.Create(nil); // Create(Application);
   FormTest.dbFile := String(dbFile);
   Result := FormTest.ShowModal;
   FormTest.Free;
end;

exports
   _Test_Form;

begin
end.

FormTest zawiera Memo i w OnShow wykonuje: Memo1.Text := dbFile;
I procedura w aplikacji Host (wywołującej):

type
  TTestProc = function(dbFile : PChar) : integer;
[...]
procedure TForm1.Button1Click(Sender: TObject);
var
   dll : THandle;
   TestProc : TTestProc; // function(dbFile : PChar) : integer;
begin
   dll := LoadLibrary('testlib.dll');
   try
      @TestProc := GetProcAddress(dll,'_Test_Form');
      if @TestProc = nil then raise Exception.Create('Function not loaded!');
      TestProc('abcdefgh');
   finally
      FreeLibrary(dll);
   end;
end;

I czy wpiszę w linijce: TestProc('abcdefg'); czy TestProc(PChar(Edit1.Text)); to w Memo z formy w dll dostaje 3 krzaczki :| dodawanie ShareMem na początku uses nie pomaga :( w dodatku przy zamykaniu formy z biblioteki dostaję AV :/

0

a gdzie masz przypisanie tekstu do memo ? bo jak w formcreate to lipa, bo wtedy pole dbFile jest jeszcze nie przypisane. Ja bym zmienił

FormTest.dbFile := String(dbFile);

naFormTest.memo1.text := String(dbFile);

albo napisał metodę dla formy SetDbFile, która poprzypisuje wszystko co trzeba i wywoływał ją w _Test_Form. Zamiast osobnej metody SetDbFile możesz dodać do formy parametryzowany konstruktor, wtedy wystarczy
```delphi
FormTest := TFormTest.Create(String(dbFile));
0

A mnie się wydaje że problem może tkwić w TestProc('abcdefgh'). Raczej powinno być TestProc(pchar('abcdefgh'));
Zakładam, że chodzi o błąd już po naciśnięciu buttona i wykonaniu podanej funkcji button1click

0

ShortString w delphi to wskaźnik PChar, z tą różnicą, że przed pierwszym znakiem PChar'a stoi kilka bajtów dodatkowych danych. Konwersja z ShortString na PChar odbywa się automatycznie i polega jedynie na ... no właśnie na niczym.

0

Możliwe, że brak dyrektywy stdcall ma znaczenie

type
  TTestProc = function(dbFile : PChar) : integer;stdcall;
0

maly186 Masz piwo u mnie :-)...

Alem ja głupi...

adf88 - czytasz com napisał? (wiem nie ładni się czepiać...) w OnShow przekazuje do Memo,
Marmar - to akurat już mniejszy problem bo wiem ,że jesli chce stringi to muszę użyć ShareMem ,a z pchar'em też miałem i mi nie działało...

Problemem był brak deklaracji stdcall za deklaracją funkcji... tak jak maly186 podpowiedział.</b>

1 użytkowników online, w tym zalogowanych: 0, gości: 1