AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

C++ Funktion nach Delphi

Ein Thema von mcbain · begonnen am 22. Aug 2012 · letzter Beitrag vom 22. Aug 2012
 
mcbain

Registriert seit: 18. Mai 2011
50 Beiträge
 
#1

C++ Funktion nach Delphi

  Alt 22. Aug 2012, 11:45
Hallo,
ich habe folgenden C++ Code:

Code:

typedef struct _CARD
   {
   
      // ---------------- 
   
      HDC      hDC;         // Graphical context
      HANDLE   hPrinter;      // Destination Printer
      
      // ----------------
                        // this will be set up with the openCard function
      int      height;         // of the card (see CR80 dimensions)
      int      width;         // idem
      
      // ----------------
      
      BOOL   bNewFontCreated;   // Font management
      HFONT   prevFont;
      HFONT   currFont;
      
      // ----------------
      
      BOOL   bNewPenCreated;      // Pen management
      HPEN   prevPen;
      HPEN   currPen;
            
      // ----------------
      
      DWORD   dwLastError;      // Error Management
      int      bOnError;
      
   } Card, * PCard;

BOOL DriverPrint_OpenCard ( PCard pCard, LPTSTR pPrinterName )
{
   pCard->bNewPenCreated   = FALSE;
   pCard->currPen         = NULL;
   pCard->prevPen         = NULL;
   pCard->bNewFontCreated   = FALSE;
   pCard->currFont         = NULL;
   pCard->prevFont         = NULL;
   pCard->height         = 648;
   pCard->width         = 1016;
   
   // ouverture du printer pour extraction contexte graphique
   
   if ( OpenPrinter( pPrinterName, &(pCard->hPrinter), NULL ) )
   {
      LONG lDVsize = DocumentProperties( NULL, pCard->hPrinter, pPrinterName, NULL, NULL, 0 );
      
      if ( lDVsize )
      {
         LPBYTE   bInDV   = new BYTE[ lDVsize ];
         LPBYTE bOutDV   = new BYTE[ lDVsize ];
         DEVMODE   sDV;
         
         if ( ( bInDV != NULL ) && ( bOutDV != NULL ) )
         {
            lDVsize = DocumentProperties( NULL, pCard->hPrinter, pPrinterName, (PDEVMODE) bOutDV, NULL, DM_COPY );

            if (lDVsize == IDOK)
            {
               if ( IDOK == DocumentProperties(NULL, pCard->hPrinter, pPrinterName, (PDEVMODE)bInDV, (PDEVMODE)bOutDV,
                                       DM_IN_BUFFER | /*DM_IN_PROMPT |*/ DM_OUT_BUFFER))
               {
                  memcpy( &sDV, bInDV, sizeof(DEVMODE) );

                  if ( pCard->hDC = CreateDC( NULL, pPrinterName, NULL, &sDV ) )
                  {
                     DOCINFO dinfo;
                     
                     dinfo.cbSize      = sizeof(DOCINFO);
                     dinfo.lpszDocName   = NULL;
                     dinfo.lpszOutput   = NULL;//"FILE:";
                     dinfo.lpszDatatype   = TEXT("raw");
                     
                     if ( StartDoc( pCard->hDC, &dinfo ) > 0 )
                     {
                        if ( StartPage( pCard->hDC ) <= 0 )
                        {
                           EvoError( pCard, "Error : StartPage Failed \r\n" );
                        }
                     } 
                     else
                     {
                        EvoError( pCard, "Error : StartDoc Failed \r\n" );
                     }
                  }
                  else // from CreateDC
                  {
                     EvoError( pCard , "Error : CreateDC Failed \r\n" );   
                  }
               }
               else // from IDOK == DocumentProperties
               {
                  EvoError( pCard, "Error : DocumentProperties Failed \r\n" );
               }
            }
            else // from (lDVsize == IDOK)
            {
               EvoError( pCard, "Error : DocumentProperties (Copy Request) Failed \r\n" );      
            }
         }
         else // from ( ( bInDV != NULL ) && ( bOutDV != NULL ) )
         {
            EvoError( pCard, "Error : Memory Allocation Failed \r\n" );
         }
         
         // nettoyage
         delete(bInDV);
         delete(bOutDV);
         if ( !ClosePrinter(pCard->hPrinter) )
         {
            EvoError( pCard, "Error : ClosePrinter Failed \r\n" );
         }
      }
      else // from lDVSize
      {
         EvoError( pCard, "Error : DocumentProperties (Size Request) Failed \r\n" );
      }
   } 
   else // openprinter
   {
      EvoError( pCard, "Error : OpenPrinter Failed \r\n" );
   }
   
   return ( !pCard->bOnError );
}
Ich habe den Code folgendermaßen nach Delphi XE 2 portiert:

Code:

 TCard = record
  private
    { Private-Deklarationen }
  public
    hDC: HDC;
    hPrinter: THandle;
    height: Integer;
    width: Integer;
    bNewFontCreated: Bool;
    prevFont: HFONT;
    currFont: HFONT;
    bNewPenCreated: Bool;
    prevPen: HPEN;
    currPen: HPEN;
    dwLastError: LongInt;
    bOnError: Integer;

    { Public-Deklarationen }
  end;

function DriverPrint_OpenCard(pCard: TCard; pPrinterName: lptstr): Bool;
var lDVsize: LONG;
    bInDV, bOutDV: TBytes;
    sdv: PDEVMODE;
    dinfo: DOCINFO;
    test: hdc;
     devA: _devicemodeA;

begin
  pCard.bNewPenCreated := False;
  pCard.currPen := 0;
  pCard.prevPen := 0;
  pCard.bNewFontCreated := False;
  pCard.currFont := 0;
  pCard.prevFont := 0;
  pCard.height := 648;
  pCard.width := 1016;

  pCard.hPrinter := 0;
  if OpenPrinter(pPrinterName,pCard.hPrinter,nil) then
  begin
    lDVsize := DocumentProperties(0,pCard.hPrinter,pPrinterName,nil,nil,0); //im C++ Programm ist lDVsize 166, in Delphi allerdings 220

    if(lDVsize <> 0) then
    begin
      SetLength(bInDV,lDVsize);
      SetLength(bOutDV,lDVsize);

      if (bInDV <> nil) and (bOutDV <> nil) then
      begin
        lDVsize := DocumentProperties(0,pCard.hPrinter,pPrinterName, PDEVMODE(bOutDV),nil,DM_COPY);

        if lDVsize = IDOK then
        begin

          if IDOK = DocumentProperties(0, pCard.hPrinter, pPrinterName, PDEVMODE(bInDV), PDEVMODE(bOutDV),
                                       DM_OUT_BUFFER OR DM_IN_BUFFER) then
          begin
   
             Move(bInDV, sDV, sizeof(DEVMODE) );          

             if pCard.hDC = CreateDC(nil,pPrinterName,nil,sdv) then //Das Delphi Programm läuft bis hierher, aber da CreateDC 0 zurück liefert durchläuft Delphi diese Bedingung nicht mehr
             begin
               dinfo.cbSize := SizeOf(DOCINFO);
               dinfo.lpszDocName := nil;
               dinfo.lpszOutput := nil;
               dinfo.lpszDatatype := 'raw';

               if StartDoc(pCard.hDC, dinfo) > 0 then
                  if StartPage(pCard.hDC) <= 0 then
                     ShowMessage('Error');

               ShowMessage('OK');
             end;
          end;
        end;
      end;

    end;

    ClosePrinter(pCard.hPrinter);

  end;

end;
Ich habe 2 Kommentare im Delphi-Code angegeben wo es zu Problemen kommt.
Hätte jemand einen Vorschlag für mich woran es scheitern könnte? Denke ich bin kurz vor der Lösung.
Vielen Dank.
Gruß
mc
  Mit Zitat antworten Zitat
 

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz