Witam
Mam problem z przekazaniem tablicy jako parametru do dllki
Mam taki oto kod:
-----------dllka-----------
library slshow;
{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }
uses
ShareMem,
SysUtils,
Classes,
Forms,
Unit1 in 'Unit1.pas' {Form1};
type
TKont = record
KolumnaDBGrid_zm: AnsiString; //kolumna na jaka ma reagowac w DBGridzie
DataField_zm: AnsiString;
KeyField_zm: AnsiString;
ListField_zm: AnsiString;
Zapytanie_zm: AnsiString;
end;
TPola = record
pole: AnsiString; //field
nazwa: AnsiString; //title
view: Boolean; //visible
ronly: boolean; //readonly
w: integer; //dlugosc
al: TAlignment; //wyrownanie
end;
PKolumny = ^TKolumny;
TKolumny = array of TPola;
PKontrolki = ^TKontrolki;
TKontrolki = array of TKont;
{$R *.res}
function showOkno(conStr_zm, mainSel_zm:PChar;var kolumny_zm: PKolumny;var kontrolki_zm: PKontrolki):integer;stdcall;
var
F: TForm1;
begin
try
F := TForm1.Create(Application);
with F do
begin
connectionStr_zm := conStr_zm;
mainSelect_zm := mainSel_zm;
Kolumny_zm := kolumny_zm;
Kontrolki_zm := kontrolki_zm;
ShowModal;
end;
finally
F.Free;
end;
Result := 0;
end;
exports
showOkno name 'showOkno';
begin
end.
-----------formatka-------------
type
TKont = record
KolumnaDBGrid_zm: AnsiString; //kolumna na jaka ma reagowac w DBGridzie
DataField_zm: AnsiString;
KeyField_zm: AnsiString;
ListField_zm: AnsiString;
Zapytanie_zm: AnsiString;
end;
TPola = record
pole: AnsiString; //field
nazwa: AnsiString; //title
view: Boolean; //visible
ronly: boolean; //readonly
w: integer; //dlugosc
al: TAlignment; //wyrownanie
end;
PKolumny = ^TKolumny;
TKolumny = array of TPola;
PKontrolki = ^TKontrolki;
TKontrolki = array of TKont;
TShowOkno = function (conStr_zm, mainSel_zm:PChar;var kolumny_zm: PKolumny;var kontrolki_zm: PKontrolki):integer;stdcall;
var
DLLInstance: THandle;
ShowOkno: TShowOkno;
wynik: integer;
mainSel_zm, conStr_zm: AnsiString;
kol_zm: TKolumny;
kon_zm: TKontrolki;
pkol_zm: PKolumny;
pkon_zm: PKontrolki;
begin
mainSel_zm := 'SELECT bank_naz, a.kraj_id, kraj_naz, kraj_skr, a.woj_id, woj_naz FROM do_bank a, do_kraj b, do_woj c WHERE a.kraj_id = b.kraj_id AND a.woj_id = c.woj_id';
conStr_zm := ADOConnection1.ConnectionString;
SetLength(kon_zm, 2);
with kon_zm[0] do
begin
KolumnaDBGrid_zm := PChar('kraj_naz');
Zapytanie_zm := PChar('SELECT * FROM do_kraj');
ListField_zm := PChar('kraj_id;kraj_skr;kraj_naz');
KeyField_zm := PChar('kraj_id');
DataField_zm := PChar('kraj_id');
end;
with kon_zm[1] do
begin
KolumnaDBGrid_zm := PChar('woj_naz');
Zapytanie_zm := PChar('SELECT * FROM do_woj');
ListField_zm := PChar('woj_naz');
KeyField_zm := PChar('woj_id');
DataField_zm := PChar('woj_id');
end;
setlength(kol_zm, 5);
with kol_zm[0] do
begin
pole := PChar('bank_naz');
nazwa := PChar('Bank');
view := True;
ronly := False;
w := 80;
al:= taLeftJustify;
end;
with kol_zm[1] do
begin
pole := PChar('woj_naz');
nazwa := PChar('Województwo');
view := True;
ronly := False;
w := 80;
al:= taLeftJustify;
end;
with kol_zm[2] do
begin
pole := PChar('woj_id');
nazwa := PChar('Województwo_id');
view := False;
ronly := False;
w := 80;
al:= taLeftJustify;
end;
with kol_zm[3] do
begin
pole := PChar('kraj_id');
nazwa := PChar('kraj_id');
view := False;
ronly := False;
w := 80;
al:= taLeftJustify;
end;
with kol_zm[4] do
begin
pole := PChar('kraj_naz');
nazwa := PChar('Kraj');
view := True;
ronly := False;
w := 80;
al:= taLeftJustify;
end;
pkol_zm := @kol_zm;
pkon_zm := @kon_zm;
DLLInstance := LoadLibrary('slshow.dll');
if DLLInstance = 0 then begin
MessageDlg('Nie mogę załadować biblioteki DLL.', mtError, [mbOK], 0);
Exit;
end;
@ShowOkno := GetProcAddress(DLLInstance, 'showOkno');
if (@ShowOkno <> nil)then
begin
wynik := ShowOkno(PChar(conStr_zm),PChar(mainSel_zm),pkol_zm,pkon_zm);
showmessage(inttostr(Wynik));
FreeLibrary(DLLInstance);
end
else
begin
MessageDlg('Nie mogę znaleźć procedury.', mtError, [mbOK], 0);
end;
No i po otwarciu dllki nic sie nie dzieje, tzn nie wyskakuje zaden blad, wszystko jest ok, ale tez tablice ta pewno nie sa przekazywane poniewaz ich zawartosc sie nie wyswietla :-(