/ Forside / Teknologi / Udvikling / Delphi/Pascal / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Delphi/Pascal
#NavnPoint
oldwiking 603
jrossing 525
rpje 520
EXTERMINA.. 500
gandalf 460
gubi 270
DJ_Puden 250
PARKENSS 230
technet 210
10  jdjespers.. 200
Opsummering. DLL fil og C til Pascal
Fra : Michael Vilhelmsen


Dato : 18-08-05 11:03

Hej Uffe, Arne, Poul, Stig og Christian.

Tak for jeres input indtil nu.
De har været yderst hjælpsome.

Jeg har fået meget til at virke. Mangler dog stadigvæk noget.

Jeg opsummere lige lidt.
For at kunne kalde funktionerne i DLL skulle jeg skrive:

function flxAdministration(func:Integer;var error: LongWord) : Integer; StdCall ; External 'flxdrv.dll';

StdCall skal bare ikke stå til sidst, som Poul skrive, for så får jeg en compiler fejl

Ovenstående funktion kan jeg nu kalde.
For, at den kunne virke, var jeg nød til at definere den første parameter (func) som en integer, og i mit program lave et par konstanter (ikke helt nødvendige, men gør det nemmere læseligt)

Konstanterne er sådan:

Const
ADMIN_ENDOFDAY = 1;
ADMIN_ENDOFDAYLOG = 2;
ADMIN_REPORT_TERMINALREPORT = 3;
ADMIN_REPORT_TOTALS = 4;
ADMIN_REPORT_LOG = 5;
ADMIN_REPORT_OLDLOG = 6;
ADMIN_LASTRECEIPT = 7;
ADMIN_UNLOCK_RECEIPT = 8;
ADMIN_CLOCKSYNCPBS = 9;
ADMIN_CLOCKSYNCPOINT = 10;
ADMIN_SENDLOG = 11;
ADMIN_CLEARDATASTORE = 12;
ADMIN_DOWNLOADPROGRAM = 13;
ADMIN_DOWNLOADPARAM = 14;
ADMIN_DOWNLOADPAN = 15;
ADMIN_DOWNLOADTLCMDB = 16;
ADMIN_RESTORETLCMDB = 17;
ADMIN_CONTRASTUP = 18;
ADMIN_CONTRASTDOWN = 19;
ADMIN_RESTARTTERMINAL = 20;
ADMIN_EJECTCARD = 21;
ADMIN_MSC = 22;
ADMIN_MAX = 23;



Hvis jeg så kalder ovenstående funktion med f.eks. ADMIN_CLOCKSYNCPBS får bliver der udført noget funktionalitet i DLL.
Denne virker faktisk nu !

Men hvis jeg kalder denne ADMIN_REPORT_TERMINALREPORT får jeg alt hvad jeg skal bruge, MEN til sidst får jeg en access violation.
Jeg er (næsten) sikker på, at der har noget at gøre med den sidste parameter (error).

Definitionen i C header filen ser sådan ud:

DllExport int flxAdministration(
         FLX_ADMIN_FUNCTION func,
         unsigned int *error);

func har jeg lavet om til en integer (i flg. samtale med leverandør var det OK, og det virker).

Så er der parametren unsigned int *error.
Jeg er faktisk ikke helt klar over, hvordan jeg skal tolke den.....

Efter at have kørt H2Pas blev funktionen defineret således:

function flxAdministration(func:FLX_ADMIN_FUNCTION; var error: Dword) : Integer; StdCall ; External 'flxdrv.dll';

Typen PDWord er defineret således:

Pdword = ^dword;


Jeg er så i tvivl om, hvordan jeg definere selve funktionskaldet (der hvor jeg skrive External; 'flxdrc.dll';) og der hvor jeg rent faktisk kalder den!


Ellers føler jeg, at jeg er nået rigtig langt, har lært meget vedr. C, DLL filer, Delphi m.m.

På forhånd tak

Michael

--

Best Regards / Venlig hilsen
Michael Vilhelmsen
==========
Best Regards / Venlig hilsen

Michael Vilhelmsen



 
 
Michael Vilhelmsen (18-08-2005)
Kommentar
Fra : Michael Vilhelmsen


Dato : 18-08-05 11:44

Ja, så kan jeg starte med selv at svare

Jeg har fået kaldet til at virker.

funktion defineret som:

function flxAdministration(func:Integer;var error: LongWord) : Integer; StdCall ; External 'flxdrv.dll';

Funktionen kaldes som:

procedure TfrmMain.Terminalrapport1Click(Sender: TObject);
var
err : LongWord;
begin
ReturnResult := flxAdministration(ADMIN_REPORT_TERMINALREPORT,Err);
end;



problemet lå åbenbart slet ikke i denne.

For at kunne benytte adskillige funktioner i DLL, har jeg skulle implementere nogle CallBack rutiner (i store træk funktioner / procedure som bliver kaldt fra DLL'en af).
For at disse virker optimalt, skulle jeg åbenbart skrive:

function Print_Receipt (Receipt_Status : DWord; PCord : TPCharBon) : Integer; SafeCall;

Altså påføre safecall. Før havde jeg påført StdCall, men den giver AV.

Så lige nu, har jeg ikke flere spørgsmål.


Takker for hjælpen indtil nu.

Michael

--

Best Regards / Venlig hilsen
Michael Vilhelmsen
==========
Best Regards / Venlig hilsen

Michael Vilhelmsen



Søg
Reklame
Statistik
Spørgsmål : 177579
Tips : 31968
Nyheder : 719565
Indlæg : 6409074
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste