- Delphiartiklar, tips, forum, länksamling - 

      

START | DELPHI | LÄNKARGÄSTBOK 




 Forum

Grundkurs
  »Introduktion
  »Snabbguide
  »Komponenter
  »Händelser
  »Strängar
  »Räkna med Delphi   »Egna typer
  »Selektion
  »Iteration
  »Menyer
  »Funktioner
  »Arraystrukturer

Tips & Tricks
  »Nya tips
  »Blandat
  »Databaser
  »Filer
  »Forms
  »Grafik
  »Internet
  »Komponenter
  »Matematik
  »Multimedia
  »Objekt/ActiveX
  »Skrivare
  »Strängar
  »System
  »Mest lästa tips

Artiklar
  »Delphi och ADO
  »Bygga en DLL
  »Skapa en enkel rapport
  »Hantera registret
  »Enheter, units
  »Klassen TCanvas
  »Använd LookUp Controls

 Nya tips
 Lägg till tips
 Delphilänkar
 Gästbok

 



 FuzzyDizzie » Delphi » Artiklar » Bygga en DLL
Operativsystem: Windows 95/98/ME/2000/XP
Delphiversion: Delphi 6 Professional eller senare
Komponenter:
  Publicerad: 2002-02-01
Läst: 3817
Röster: 35
Skribent: Sven-Åke Persson (SvenPon)

Rösta på artikeln


Förord


En av de kraftigaste fördelarna med Delphi är att du kan bygga DLL :er som löser ett behov av snabba rutiner, då främst inom stränghantering och komplicerade matematik algoritmer. Om du kan Vb syntax blir det väldigt enkelt att komma igång.
Dessa DLL:er kan enkelt anropas från VB. DLL:erna blir "StandAlone" dvs du behöver inte bekymra dig om att bifoga en massa extra tillbehör.
I Delphi kan du göra inline assembler som sedan t ex VB kan dra nytta av.

Ett stort tack till Staffan Berg som startade denna artikelserie om Delphi.
Artikel 251 och 252 leder Er vidare i Delphi:s underbara värld.

Inledning
Handlingsmönstret blir som följer:

  • Välj New  (under File)
  • Välj DLL
  • Spara Som  "MyFirstDll.dpr" i din arbetskatalog

Ditt Pascal kodfönster skall nu se ut så här.


library MyFirstDll;
{ To avoid using BORLNDMM.DLL, pass string      
information using PChar or ShortString parameters.}
uses
  SysUtils,Classes;

{$R *.RES}
begin
end.

Nu kan vi börja bygga vår DLL. Jag skall ge ett exempel på några enkla matematik funktioner och en strängfunktion, som är den krångligaste delen av DLL bygge. Vi skall bygga på ett "proffsigt" sätt, dvs tillverka en ny Unit som Vi sedan skall lägga in / koppla i uses (se koden ovan).

Utförand
Vi skall bygga på ett "proffsigt" sätt, dvs tillverka en ny Unit som Vi sedan skall lägga in / koppla i uses (se koden ovan).

  • Välj New igen
  • Välj Unit
  • Spara Som Vbapp.pas
Nu skall ditt projekt se ut så här:

När du klickar på  MyFirstDll  så har det tillkommit Vbapp in 'Vbapp.pas';  under Uses


library MyFirstDll;
{ To avoid using BORLNDMM.DLL, pass string  information using PChar or ShortString parameters.}
uses
  SysUtils,
  Classes,
  Vbapp in 'Vbapp.pas';
{$R *.RES}
begin
end.

Från och med nu skall vi jobba i unit VBApp. Eftersom jag är gammal navigatör så blir det ett exempel på omvandling från Knop till Km / h samt
Distansminuter till Km.
Man kan också se hur man behandlar strängar i en Delphi DLL
Här ser ni hur Funktionerna och Subrutin är utformade:

unit Vbapp;
interface
//Viktigt deklarera för Export och som StdCall
Function KnopToKm(inKnop : Single) :
              Single;Export;StdCall;
Function DmToKm(inMinut  : Single) :
              Single;Export;StdCall;
// String måste behandlas efter denna princip
Procedure StrConvert(inStr :String ;
    outStr : PChar);Export;StdCall ;

implementation
uses
//jag behövde denna uses därför att jag använder ffFixed
  SysUtils ;
Function KnopToKm(inKnop : Single):Single ;
var
     retValue : String ;
Begin
retValue  := FloatToStrF(inKnop / 0.54,ffFixed,10,1) ;
KnopToKm := StrToFloat(retValue) ;
End ;
//*******************************
Function DmToKm(inMinut : Single):Single ;
//Distansminuter till km
var
retValue : String ;
Begin
   retValue  := FloatToStrF(inMinut/0.54,ffFixed,10,1) ;
   DmToKm := StrToFloat(retValue) ;
End ;
//*******************************
Procedure StrConvert(inStr:String ; outStr : PChar);
{I brist på ideer kunde jag inte hitta på annat än detta, jag gör reverse på inStr}
// Tack till signatur  Q för hjälp med denna sub
Var
  tmpStr  : String ;
  tmpChar : Char ;
     i   : Integer ;
Begin
     For i  := Length(inStr) downto 1 do
     Begin
       tmpChar := inStr[i] ;
       tmpStr  := tmpStr + tmpChar ;
     End ;
//här blir outStr åtkomlig för VB
        StrPCopy(outStr,tmpStr) ;
End ;
//*******************************
end.



















































Testa programmet
Nu kan du provköra med Run. Då skapas en fil i din arbetsmapp MyFirstDll.dll. Om du får ett felmeddelande om Debug så kan du ignorera det genom att klicka Ok. MyFirstDll.dll är inte klar men Vi har fått kvitto på att första delen av kodningen är Ok. Nu kommer en sista åtgärd innan Dll:en är klar för användning.

  • Välj  MyFirstDll
    (Vi skall göra ytterligare en Editering)


library MyFirstDll;
{ To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }
uses
  SysUtils,
  Classes,
  Vbapp in 'Vbapp.pas' ;
{$R *.RES}
Exports KnopToKm , DmToKm , StrConvert ;
begin
end














Under {$R *.RES} före begin skall Vi lägga till vilka Functioner eller
Subrutiner som skall Exporteras (göras åtkomliga från yttre program). Vi
skriver in alla Funktionerna Exports KnopToKm , DmToKm, StrConvert ;
  • Kör Run      
    Dll:en är nu färdigkompilerad och ligger i din arbetsmapp klar att användas från
    tex VB enl exempel nedan

Här är ett litet Vb-program som testar  MyFirstDll.dll:

Option Explicit
'Enkelt test program som testar vår Delphi DLL
Private Declare Function KnopToKm Lib "MyFirstDll.dll" _
                                    (ByVal knop As Single) As Single

Private Declare Function DmToKm Lib "MyFirstDll.dll" _
                               (ByVal dminuter As Single) As Single

Private Declare Sub StrConvert Lib "MyFirstDll.dll" _
      (ByVal TestStr As String, ByVal LpStr As String)

Private Sub Command1_Click()
Dim retVal As Single
retVal = KnopToKm(10.78)
MsgBox retVal & "  km/h"
End Sub

Private Sub Command2_Click()
Dim retVal As Single
  retVal = DmToKm(340)
  MsgBox retVal & "  km"
End Sub

Private Sub Command3_Click()
'StrBuffer kommer att inehålla retur strängen
Dim StrBuffer As String * 20
StrConvert "Sven Persson", StrBuffer
MsgBox StrBuffer
End Sub



 
 
© Copyright 2005 - Staffan Berg
- Alla rättigheter förbehålles -