Bygg en DLL i Delphi för VB
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 tex 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ärldInnehåll
»»
»
Relaterade artiklar
» Introduktion till Delphi» Skapa program i Delphi
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ånligaste delen av DLL bygge.
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 Debugg 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
0 Kommentarer