Einzelnen Beitrag anzeigen

mcbain

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

C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12: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