Muster einer Delphi-Schnittstelle

 

 

{************************************************************************}

{                     DELPHI 2/3/4/XE -Schnittstelle                     }

{      zu einigen Funktionen der 32 Bit Dynamic Link Library GeoDLL.     }

{     Sie muss gegebenenfalls um andere Funktionen erweitert werden.     }

{ Die Schnittstelle kann direkt in den DELPHI-Quellcode eingebaut werden }

{                                                                        }

{       Autoren: Killet GeoSoftware Ing.-GbR und IVU GmbH, Berlin.       }

{  Getestet mit DELPHI XE am 29.1.2015, Herrn Schettler, RATIOSoftware.  }

{                                                                        }

{    Im Aufrufverzeichnis von GeoDLL müssen die Dateien geodll32.dll     }

{                    und geodllbn.bin vorhanden sein.                    }

{************************************************************************}

 

 

unit GeoDll32;

 

interface

 

uses Windows, Dialogs;

 

{ Koordinatensysteme }

const

GEO = 1;  { geographische Koordinaten }

GK3 = 2;  { Gauss-Krueger-Koordinaten (3 Grad) }

UTM = 3;  { UTM-Koordinaten }

GK6 = 4;  { Gauss-Krueger-Koordinaten (6 Grad) }

BMN = 5;  { Transversal Mercator (England) }

 

{ Bezugssysteme }

DEFAULT     =    0;  { bei geographischen Koordinaten: PD }

                     { bei Gauss-Krueger-Koordinaten (3 Grad): PD }

                     { bei UTM-Koordinaten: ED50 }

                     { bei Gauss-Krueger-Koordinaten (6 Grad): SYSTEM43/83 }

                     { bei Transversal Mercator (England): OSGB36 }

PD          =    1;  { PD, Rauenberg, Bessel (1841) }

ED50        =    2;  { ED50, Potsdam, Hayford (1909) / Internat. (1924) }

SYSTEM4283  =    3;  { SYSTEM42/83, Pulkowo, Krassowskij (1940) }

ETRS89      =    4;  { ETRS89, earth centerd, GRS80 (1980) }

MGI         =    5;  { MGI, Hermannskogel, Bessel (1841) }

NTF         =    6;  { NTF, Pantheon (Paris), Clarke IGN (1880) }

RDNAP       =    7;  { RD/NAP, Amersfoort, Bessel (1841) }

CH1903      =    8;  { CH1903, Old Observatory Bern, Bessel (1841) }

RD83        =    9;  { RD83, Bessel (1841) }

WGS84       =   10;  { WGS84 (GPS), earth centerd, WGS84 (1984) }

WGS72       =   11;  { WGS72, earth centerd, WGS72 (1972) }

USERDEF     = 1000;  { User-definierter Bezugssystemwechsel (setuserrefsys) }

KEINS       = 1100;  { kein Bezugssystemwechsel }

 

{ Notation (Schreibweise) der geographischen Koordinaten }

GGGNNN = 0;  { ggg.nnn (g = Grad, n = Minuten und Sekunden als }

             { dezimaler Bruchteil eines Grades }

GGMMSS = 1;  { gggmmss.nnn (g = Grad, m = Minuten, s = Sekunden, }

             { n = dezimaler Nachkommaanteil der Sekunden }

 

{ Freischalten der DLL-Funktionsgruppen }

{ DELPHI 2/3/4 use pchar, DELPHI XE use pAnsichar }

type tGeo_Setunlockcode = function 

(

 FCode : pAnsichar;          { Freischaltschluessel }

 LNehm : pAnsichar           { Lizenznehmerbezeichnung }

) : dword; stdcall;

var  setunlockcode : tGeo_Setunlockcode;

 

{ Koordinatentransformation }

type tGeo_Coordtrans3 = function

(

 dKoordXQ     : double;  { X-Koordinate des Quellkoordinatensystems }

 dKoordYQ     : double;  { Y-Koordinate des Quellkoordinatensystems }

 sKoordSysQ   : word;    { Kennung fuer das Quellkoordinatensystem }

 sBezSysQ     : word;    { Kennung fuer das Quellbezugssystem }

 sNotationQ   : word;    { Kennung fuer die Notation der Quellkoordinat. }

 var dKoordXZ : double;  { X-Koordinate des Zielkoordinatensystems }

 var dKoordYZ : double;  { Y-Koordinate des Zielkoordinatensystems }

 sKoordSysZ   : word;    { Kennung fuer das Zielkoordinatensystem }

 sBezSysZ     : word;    { Kennung fuer das Zielbezugssystem }

 sNotationZ   : word;    { Kennung fuer die Notation der Zielkoordinaten }

 sStreifenZ   : word     { Kennung fuer den Zielmeridianstreifen }

 ) : dword;  stdcall;

 var coordtrans3 : tGeo_Coordtrans3;

 

{ Transformationsparameter fuer benutzerdefiniertes Bezugssystem }

{ Nur notwendig, wenn benutzerdefiniertes Bezugssystem verwendet wird }

type tGeo_Setuserrefsys = function

(

 sRefSysTyp  : word;    { Flag zum Anlegen / Löschen eines Bezugssystems }

 dTranslX    : double;  { Verschiebung auf der X-Achse (Translation) }

 dTranslY    : double;  { Verschiebung auf der Y-Achse }

 dTranslZ    : double;  { Verschiebung auf der Z-Achse }

 dRotX       : double;  { Drehung der X-Achse (Rotation) }

 dRotY       : double;  { Drehung der Y-Achse }

 dRotZ       : double;  { Drehung der Z-Achse }

 dMasstab    : double   { Masstabsfaktor in ppm }

 ) : dword;  stdcall;

 var setuserrefsys : tGeo_Setuserrefsys;

 

{ Ellipsoidhabachsen für benutzerdefinierten Quellellipsoiden }

{ Nur notwendig, wenn benutzerdefiniertes Bezugssystem verwendet wird }

type tGeo_Setuserellsource = function

(

 sEllSource  : word;    { Flag für das Quellellipsoid } 

 dHalbAchsGrQ : double;  { Grosse Halbachse des Quellellipsoiden }

 dHalbAchsKlQ : double   { Kleine Halbachse des Quellellipsoiden }

 ) : dword;  stdcall;

 var setuserellsource : tGeo_Setuserellsource;

 

{ Ellipsoidhabachsen für benutzerdefinierten Zielellipsoiden }

{ Nur notwendig, wenn benutzerdefiniertes Bezugssystem verwendet wird }

type tGeo_Setuserelltarget = function

(

 sEllTarget  : word;    { Flag für das Zielellipsoid } 

 dHalbAchsGrZ : double;  { Grosse Halbachse des Zielellipsoiden }

 dHalbAchsKlZ : double   { Kleine Halbachse des Zielellipsoiden }

 ) : dword;  stdcall;

 var setuserelltarget : tGeo_Setuserelltarget;

 

{ Entfernung zwischen zwei Koordinatenpaaren }

type tGeo_Distancegeo = function

(

 dGeoLaenge1 : double;  { Geogr. Laenge der ersten Koordinate }

 dGeoBreite1 : double;  { Geogr. Breite der ersten Koordinate }

 dGeoLaenge2 : double;  { Geogr. Laenge der zweiten Koordinate }

 dGeoBreite2 : double;  { Geogr. Breite der zweiten Koordinate }

 var dStrecke: double;  { Berechnete Entfernung }

 sEllipsoid  : word     { Kennung fuer das geodaetische Ellipsoid }

) : dword;  stdcall;

var distancegeo : tGeo_Distancegeo;

 

function KoordSysCode (S:String):Integer;

function BezSysCode   (S:String):Integer;

 

implementation

 

function KoordSysCode (S:String):Integer;

begin

 KoordSysCode := 1;

 if S = 'GEO' then KoordSysCode := 1;

 if S = 'GK3' then KoordSysCode := 2;

 if S = 'UTM' then KoordSysCode := 3;

 if S = 'GK6' then KoordSysCode := 4;

 if S = 'TME' then KoordSysCode := 5;

end;

 

function BezSysCode (S:String):Integer;

begin

 BezSysCode := 0;

 if S = 'PD'          then BezSysCode := 1;

 if S = 'ED50'        then BezSysCode := 2;

 if S = 'SYSTEM4283'  then BezSysCode := 3;

 if S = 'ETRS89'      then BezSysCode := 4;

 if S = 'MGI'         then BezSysCode := 5;

 if S = 'NTF'         then BezSysCode := 6;

 if S = 'RDNAP'       then BezSysCode := 7;

 if S = 'CH1903'      then BezSysCode := 8;

 if S = 'RD83'        then BezSysCode := 9;

 if S = 'WGS84'       then BezSysCode := 10;

 if S = 'WGS72'       then BezSysCode := 11;

 if S = 'KEINS'       then BezSysCode := 1100;

end;

 

function T_Error (

 dKoordXQ     : double;

 dKoordYQ     : double;

 sKoordSysQ   : word;

 sBezSysQ     : word;

 sNotationQ   : word;

 var dKoordXZ : double;

 var dKoordYZ : double;

 sKoordSysZ   : word;

 sBezSysZ     : word;

 sNotationZ   : word;

 sStreifenZ   : word

 ) : dword; stdcall;

begin

 ShowMessage ('GeoDLL32 : Function coordtrans3() not bound ');

 dKoordXZ := 0;

 dKoordYZ := 0;

 T_ERROR  := 0;

end;

 

function F_Error 

(

 FCode : pchar;

 LNehm : pchar

) : dword; stdcall;

begin

 ShowMessage ('GeoDLL32 : Function setunlockcode() not bound ');

 F_ERROR  := 0;

end;

 

function D_Error

(

 dGeoLaenge1 : double;

 dGeoBreite1 : double;

 dGeoLaenge2 : double;

 dGeoBreite2 : double;

 var dStrecke: double;

 sEllipsoid  : word

) : dword;  stdcall;

begin

 ShowMessage ('GeoDLL32 : Function distancegeogeo() not bound ');

 dStrecke := 0;

 D_Error := 0;

end;

 

function TP_Error

(

 sRefSysTyp  : word;

 dTranslX    : double;

 dTranslY    : double;

 dTranslZ    : double;

 dRotX       : double;

 dRotY       : double;

 dRotZ       : double;

 dMasstab    : double

) : dword;  stdcall;

begin

 ShowMessage ('GeoDLL32 : Function setuserrefsys() not bound ');

 TP_Error := 0;

end;

 

function ES_Error

(

 sEllSource  : word;

 dHalbAchsGrQ : double;

 dHalbAchsKlQ : double

) : dword;  stdcall;

begin

 ShowMessage ('GeoDLL32 : Function getuserellsource() not bound ');

 ES_Error := 0;

end;

 

function ET_Error

(

 sEllTarget  : word;

 dHalbAchsGrZ : double;

 dHalbAchsKlZ : double

) : dword;  stdcall;

begin

 ShowMessage ('GeoDLL32 : Function getuserelltarget() not bound ');

 ET_Error := 0;

end;

 

var LHandle : tHandle;

 

procedure LoadLib;

begin

{ GeoDLL laden und Zeiger auf die DLL-Funktionen setzen }

   LHandle := LoadLibrary('geodll32.dll');

   if LHandle <> 0

   then begin

         Setunlockcode    := GetProcAddress(LHandle, 'setunlockcode');

         Coordtrans3      := GetProcAddress(LHandle, 'coordtrans3');

         Distancegeo      := GetProcAddress(LHandle, 'distancegeo');

         Setuserrefsys    := GetProcAddress(LHandle, 'setuserrefsys');

         Setuserellsource := GetProcAddress(LHandle, 'setuserellsource');

         Setuserelltarget := GetProcAddress(LHandle, 'setuserelltarget');

        end

   else begin

         Setunlockcode    := @F_Error;

         Coordtrans3       := @T_Error;

         Distancegeo      := @D_Error;

         Setuserrefsys    := @TP_Error;

         Setuserellsource := @ES_Error;

         Setuserelltarget := @ET_Error;

         ShowMessage ('Unable to load Geodll32.dll');

        end;

end;

 

initialization

 

 { GeoDLL-Funktionen laden }

 LoadLib;

 

 { Hier kann die GeoDLL freigeschaltet werden }

 Setunlockcode ('Ihr Freischaltschluessel','Ihre Lizenznehmerbezeichnung');

 

finalization

 

 if LHandle <> 0 then FreeLibrary(LHandle);

 

end.