Beispielprogramm in C++

 

 

/************************************************************************/

/*                        Beispielprogramm in C++                       */

/*                CTEST: Ein Windows API style Programm                 */

/*                                                                      */

/*                   Autor: Killet GeoSoftware Ing.-GbR                 */

/*                      und Axel Bieroegel, GTSE mbH                    */

/*                                                                      */

/*    C++ Demonstrationsprogramm zum Einbinden von GeoDLL-Funktionen    */

/*                                                                      */

/*  Im Aufrufverzeichnis des Programms müssen die Dateien geodll32.dll  */

/*                    und geodllbn.bin vorhanden sein.                  */

/************************************************************************/

 

// Das Programm greift mit Hilfe der Funktion LoadLibrary() auf die

// Funktionen setunlockcode() und coordtrans3() der GeoDLL32.dll zu. Mit

// der Funktion coordtrans3() werden einige Berechnungen durchgefuehrt

// und in einem Fenster dargestellt.

 

// Softwarevertrieb und Programmautor der GeoDLL:

// Killet GeoSoftware Ing.-GbR

// Escheln 28a

// 47906 Kempen (Germany)

// Tel: ++49 / (0)2152 / 961127

// Fax: ++49 / (0)2152 / 961128

// Internet: https://www.killetsoft.de

// Email: https://www.killetsoft.de/cgi-bin/mailing/anfrage.pl?lan=d

 

 

#include <stdafx.h>

#include <windows.h>

#include <iostream.h>

#include <stdlib.h>

#include <stdio.h>

 

 

long FAR PASCAL WndProc(HWND hwnd,UINT message, UINT wParam, LONG lParam)

{

  HDC         hdc;

  HPEN        hpen;

  HGDIOBJ     hpenOld;

  PAINTSTRUCT ps;

  RECT        rect;

  double      nKoordXZ_1, nKoordYZ_1, nKoordXZ_2, nKoordYZ_2,

              nKoordXZ_3, nKoordYZ_3, nKoordXZ_4, nKoordYZ_4;

  long int    BoolRet_1, BoolRet_2, BoolRet_3, BoolRet_4;

  char        Text[100], String1[100], String2[100], String3[100],

              String4[100];

  HINSTANCE   hInstance;

  DWORD       LastError;

 

  long int (_stdcall *pFrei) (char*,char*) = NULL;

 

  long int (_stdcall *pTrans)

    (double,double,short int,short int,short int,double *,double *,

    short int,short int,short int,short int) = NULL;

 

  // DLL-Funktionen explizit binden, da weder GeoDLL32.LIB noch 

  // GeoDLL32.DEF zur Verfuegung stehen. Dabei Fehler abfangen.

  if ((hInstance  =::LoadLibrary("geodll32.dll")) != NULL)

  {

    if ((pFrei = (long int (_stdcall *) (char *,char *))

      ::GetProcAddress(hInstance,"setunlockcode")) == NULL)

      LastError = GetLastError();

    if (pFrei != NULL)

    {

      if ((pTrans = (long int (_stdcall *)

      (double,double,short int,short int,short int,double *,double *,

      short int,short int,short int,short int))

      ::GetProcAddress(hInstance,"coordtrans3")) == NULL)

      LastError = GetLastError();

    }

  }

  else

    LastError = GetLastError();

 

  // Vorbereitung fuer die Textausgabe im Fenster.

  switch (message)

  {

    case WM_PAINT:

      hdc = BeginPaint(hwnd, &ps);

      GetClientRect(hwnd, &rect);

      hpen = CreatePen(PS_SOLID, 6, RGB(0, 0, 255));

      hpenOld = SelectObject(hdc, hpen);

      Rectangle(hdc, rect.left + 10,rect.top + 10,rect.right - 10,

        rect.bottom - 10);

      ExtTextOut(hdc,           // handle to device context

                 rect.left +20, // x-coordinate of reference point

                 rect.top  +20, // y-coordinate of reference point

                 ETO_CLIPPED,   // text-output options

                 &rect,         // optional clipping / opaquing rect.

                 "String 1",    // points to string

                 0,             // number of characters in string

                 NULL);         // pointer to array of interchar sp. val.

 

      // Fehlerbehandlung: Ausgabe der Fehlertexte, wenn DLL nicht geoeffnet

      // werden konnte oder der Zugriff auf die Funktionen nicht moeglich ist.

      if (hInstance == NULL)

      {

        sprintf (Text,"   Errorcode = %ld",LastError);

        ExtTextOut( hdc,rect.left+20,rect.top+40,ETO_CLIPPED,&rect,

          "DLL geodll32.dll error on open",30,NULL);

        ExtTextOut( hdc,rect.left+20,rect.top+60,ETO_CLIPPED,&rect,

          Text,strlen(Text),NULL);

      }

      else

      {

        ExtTextOut( hdc,rect.left+20,rect.top+40,ETO_CLIPPED,&rect,

          "DLL geodll32.dll loaded (OK)",28,NULL);

        if (pTrans == NULL)

        {

          sprintf (Text,"   Errorcode = %ld",LastError);

          ExtTextOut( hdc,rect.left+20,rect.top+60,ETO_CLIPPED,&rect,

            "One or more functions not found",31,NULL);

          ExtTextOut( hdc,rect.left+20,rect.top+80,ETO_CLIPPED,&rect,

            Text,strlen(Text),NULL);

        }

        else

          ExtTextOut( hdc,rect.left+20,rect.top+60,ETO_CLIPPED,&rect,

            "All function found (OK)",23,NULL);

      }

 

      // DLL-Funktionen aufrufen und Ergebnisse ausgeben.

      // Die Funktion coordtrans3() kann ohne Eingabe der gueltigen 

      // Freischaltparameter hier nur während einer kurzen Zeit pro

      // Programmlauf aufgerufen werden. Alternativ kann hier die

      // Funktion setunlockcode() eingebaut werden. Nach der Eingabe der

      // gueltigen Freischaltparameter, die beim Softwarevertrieb erworben

      // werden koennen, sind alle Beschraenkungen aufgehoben.

      /*

      if (pFrei != NULL)

        BoolRet = pFrei("pszCode","pszLizN");

      // mit pszCode = char* Freischaltcode

      // mit pszLizN = char* Lizenznehmerbezeichnung

      */

 

      // Vier Koordinatentransformationen durchführen:

      // Gauss-Krueger (3 Grad breite Meridianstreifen) (Streifen 4) -->

      //  Geographische ohne Bezugssystemwechsel, ggmmss-Notation

      // Gauss-Krueger (3 Grad breite Meridianstreifen) (Streifen 2) -->

      //  UTM (natürlicher Meridianstreifen) mit Bezugssystemwechsel

      // Gauss-Krueger (3 Grad breite Meridianstreifen) (Streifen 2) -->

      //  UTM (Streifen 32) mit Bezugssystemwechsel

      // UTM --> Gauss-Krueger (6 Grad breite Meridianstreifen)

      //  (natürlicher Meridianstreifen) mit Bezugssystemwechsel

      if (pTrans != NULL)

      {

        BoolRet_1 = pTrans(4556879.09,5612654.21,2,1,0,

          &nKoordXZ_1,&nKoordYZ_1,1,1,1,0);

        sprintf (String1,"Ret=%1d,  KoordXZ=%9.2lf,  KoordYZ=%9.2lf",

          BoolRet_1,nKoordXZ_1,nKoordYZ_1);

        ExtTextOut( hdc,rect.left+20,rect.top+100,ETO_CLIPPED,&rect,

          "Ret = trans(4556879.09, 5612654.21, ...)",40,NULL);

        ExtTextOut(hdc,rect.left+20,rect.top+120,ETO_CLIPPED,&rect,

          String1,strlen(String1),NULL);

 

        BoolRet_2 = pTrans(2479976.65,5658876.14,2,1,0,

          &nKoordXZ_2,&nKoordYZ_2,3,2,0,0);

        sprintf (String2,"Ret=%1d,  KoordXZ=%11.2lf,  KoordYZ=%10.2lf",

          BoolRet_2,nKoordXZ_2,nKoordYZ_2);

        ExtTextOut( hdc,rect.left+20,rect.top+160,ETO_CLIPPED,&rect,

          "Ret = trans(2479976.65, 5658876.14, ...)",40,NULL);

        ExtTextOut(hdc,rect.left+20,rect.top+180,ETO_CLIPPED,&rect,

          String2,strlen(String2),NULL);

 

        BoolRet_3 = pTrans(2479976.65,5658876.14,2,1,0,

          &nKoordXZ_3,&nKoordYZ_3,3,2,0,32);

        sprintf (String3,"Ret=%1d,  KoordXZ=%11.2lf,  KoordYZ=%10.2lf",

          BoolRet_3,nKoordXZ_3,nKoordYZ_3);

        ExtTextOut( hdc,rect.left+20,rect.top+220,ETO_CLIPPED,&rect,

          "Ret = trans(2479976.65, 5658876.14, ...)",40,NULL);

        ExtTextOut(hdc,rect.left+20,rect.top+240,ETO_CLIPPED,&rect,

          String3,strlen(String3),NULL);

 

        BoolRet_4 = pTrans(32577386.91,5659050.78,3,2,0,

          &nKoordXZ_4,&nKoordYZ_4,4,3,0,0);

        sprintf (String4,"Ret=%1d,  KoordXZ=%10.2lf,  KoordYZ=%10.2lf",

          BoolRet_4,nKoordXZ_4,nKoordYZ_4);

        ExtTextOut( hdc,rect.left+20,rect.top+280,ETO_CLIPPED,&rect,

          "Ret = trans(32577386.91, 5659050.78, ...)",41,NULL);

        ExtTextOut(hdc,rect.left+20,rect.top+300,ETO_CLIPPED,&rect,

          String4,strlen(String4),NULL);

      }

 

      SelectObject(hdc, hpenOld);

      DeleteObject(hpen);

      EndPaint(hwnd, &ps);

      return 0;

 

    case WM_DESTROY:

      PostQuitMessage(0);

      return 0;

  }

  return DefWindowProc(hwnd, message, wParam, lParam);

}

 

 

// Programm initialisieren und WINDOWS-Fenster generieren.

int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,

    LPSTR lpszCmdParam, int nCmdShow)

{

  static char szAppName[] = "CTEST";

  HWND        hwnd;

  MSG         msg;

  WNDCLASS    wndclass;

 

  if (!hPrevInstance)

  {

      wndclass.style         = CS_HREDRAW | CS_VREDRAW;

      wndclass.lpfnWndProc   = WndProc;

      wndclass.cbClsExtra    = 0;

      wndclass.cbWndExtra    = 0;

      wndclass.hInstance     = hInstance;

      wndclass.hIcon         = LoadIcon(NULL, IDI_APPLICATION);

      wndclass.hCursor       = LoadCursor(NULL, IDC_ARROW);

      wndclass.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);

      wndclass.lpszMenuName  = NULL;

      wndclass.lpszClassName = szAppName;

 

      RegisterClass(&wndclass);

  }

 

  hwnd = CreateWindow(szAppName,  // window class name

      "CTEST GeoDLL32 Program",  // window caption

      WS_OVERLAPPEDWINDOW,        // window style

      CW_USEDEFAULT,              // initial x position

      CW_USEDEFAULT,              // initial y position

      CW_USEDEFAULT,              // initial x size

      CW_USEDEFAULT,              // initial y size

      NULL,                       // parent window handle

      NULL,                       // window menu handle

      hInstance,                  // program instance handle

      NULL);                      // creation parameters

 

  ShowWindow(hwnd, nCmdShow);

  UpdateWindow(hwnd);

 

  while (GetMessage(&msg, NULL, 0, 0))

  {

    TranslateMessage(&msg);

    DispatchMessage(&msg);

  }

  return msg.wParam;

}