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
Antwort Antwort
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
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 11:52
Delphi-Quellcode:
pCard.hDC := CreateDC(nil,pPrinterName,nil,sdv);
if pCard.hDC <> 0 then
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mcbain

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

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 11:57
Vielen Dank für die schnelle Antwort aber das hat das Problem leider nicht gelöst.
Ich denke das Problem beginnt auch schon früher, da ja lDVsize bei mir 220 ist und in C++ 165.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:09
Könnte das mit Ansi/Unicode zusammenhängen?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mcbain

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

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:26
Ist durchaus möglich, wenn ich an der 1. Stelle
DocumentPropertiesA(0,pCard.hPrinter,PAnsiChar(pPrinterName), PDEVMODE (bOutDV),nil,DM_COPY);
verwende, dann bekomme ich zumindest hier das gleiche Erbebnis wie in C++.
Aber das andere Problem besteht weiterhin...

Geändert von mcbain (22. Aug 2012 um 12:32 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:34
D.h. CreateDC liefert 0 zurück? Hast Du mal testhalber pPrinterName als PAnsiChar übergeben?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.140 Beiträge
 
Delphi 12 Athens
 
#7

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:42
pPrinterName ist doch lptstr, also PWideChar, seit D2009.

Da sollte der Compiler also bei DocumentPropertiesA(0,pCard.hPrinter,PAnsiChar(pPrinterName), PDEVMODE(bOutDV),nil,DM_COPY); rummotzen.

Wie wird denn DriverPrint_OpenCard aufgerufen? (ich würde erstmal dort den Fehler suchen)



Tja, anfangs war fast alles dynamisch programmiert, womit es sich seit D2009 automatisch auf Unicode umstellen sollte ... bis auf devA: _devicemodeA;

String, Char, PChar, ApiFunktion, Struktur/Record
AnsiString, AnsiChar, PAnsiChar, ApiFunktionA, StrukturA/RecordA
WideString/UnicodeString, WideChar, PWideChar, ApiFunktionW, StrukturW/RecordW

NIEMALS vermischen

Und wie ich es immer wieder prädige: Wertet endlich mal die Rückgabewerte und Fehlermeldungen der Funktionen aus, welche ihr aufruft.
Die sagen euch meistens schon, was ihnen nicht gefällt ... man muß nur drauf hören.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Aug 2012 um 12:47 Uhr)
  Mit Zitat antworten Zitat
Robotiker
(Gast)

n/a Beiträge
 
#8

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:45
NIEMALS vermischen
Das betrifft in diesem Fall auch die Strukturmakros wie DOCINFO. Ich bin mir ziemlich sicher, VC ersetzt die zu DOCINFOA bzw. DOCINFOW, d.h. die sind eventuell auch unterschiedlich.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:49
Einen ähnlichen Verdacht habe ich auch, aber ich kenne mich mit den C++-Datentypen nicht gut aus.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Aphton
Aphton

Registriert seit: 31. Mai 2009
1.198 Beiträge
 
Turbo Delphi für Win32
 
#10

AW: C++ Funktion nach Delphi

  Alt 22. Aug 2012, 12:57
Hab mir nur die Rümpfe angeschaut und weiß nicht ob es evt daran liegt, ABER...
Code:
  BOOL DriverPrint_OpenCard ( PCard pCard, LPTSTR pPrinterName )
  function DriverPrint_OpenCard(pCard: TCard; pPrinterName: lptstr): Bool; ..
"PCard pCard" <> "pCard: TCard"

Richtig:
"PCard pCard"
= "pCard: PCard" (wobei PCard = ^TCard)
= "var pCard: TCard"
das Erkennen beginnt, wenn der Erkennende vom zu Erkennenden Abstand nimmt
MfG
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 06:21 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz