Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-DLL (https://www.delphipraxis.net/148576-bitte-um-hilfe-bei-uebersetzung-c-delphi-mit-fremd-dll.html)

jus 4. Mär 2010 14:20


Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-DLL
 
Hallo,

Ich bin schon am verzweifeln :gruebel: :wall: , plage mich schon seit einigen Nächten damit, die DLL anzusprechen. Ich habe eine fremde DLL, die ich verwenden möchte. Es gibt eine Beispieldatei leider nur in VisualC++ 6.0, die die DLL anspricht. Erschwerend kommt noch hinzu, dass anscheinend in diesem Beispiel die Aufrufe in einer Klasse gekapselt sind. Meine Frage ist kann man sowas überhaupt in Delphi ansprechen? Ich habe nämlich keinen Plan wie ich diese 2 Objekte "CPrintInternal" u. "CPrintPresetInternal"in Delphi nachbauen könnte, die anscheinend die DLL verlangt.

Auszug von Header definition PrintSDK.h
Code:
typedef   long         PRINTERROR;
/* Internal Version */
#define PRINT_INTERNAL_VERSION            100      /* means Ver1.00 */

/*****************************************************************************
 *   Base class for Print SDK.
 *****************************************************************************/
class CPrintInternal;               /* Internal data of CPrint */

class PRINT_SDK_DLL_API CPrint {

protected:
   CPrintInternal         *m_pPrintInternal;
   long            m_lInternalVersion;

public:
               CPrint(const long            in_lInternalVersion = PRINT_INTERNAL_VERSION);
   virtual            ~CPrint();

   virtual      PRINTERROR   PRINT_GetData(
                        HPUTIL_STR1023         &out_AlertString,
                        PRINT_DATAINF         &out_PrintData);
};
/*****************************************************************************
 *   Interface class for PRINT SDK
 *****************************************************************************/
class CPrintPresetInternal;         /* Internal data of CPrintPreset */

class PRINT_SDK_DLL_API CPrintPreset : public CPrint {

protected:
   CPrintPresetInternal      *m_pPrintPresetInternal;

public:
                  CPrintPreset(
                        const long   in_lInternalVersion = PRINT_INTERNAL_VERSION);

   virtual               ~CPrintPreset();
};
In der Beispielanwendung wird die DLL folgendermaßen angesprochen:
Code:
#include "PRINTSDK.h"

/*****************************************************************************
 *   CPrintFunc class definition
 *****************************************************************************/
class CPrintFunc
{
private:
   CPrintPreset*         m_pPrintPreset;
   PRINT_PRESETDATA*      m_pPresetItemList;
   long            m_lPresetCount;
   PPrint_PRINTERTYPE      m_PrintPrinterType;   /* Printer Type */

   /*************************************************************************
    * Internal Methods
    *************************************************************************/
   // create CPrintPreset class object
   PRINTERROR   CreatePrintSdk();

public:
   // Constructor
   CPrintFunc();
   // Destructor
   virtual ~CPrintFunc();
        /*************************************************************************
    * Methods
    *************************************************************************/
        // get printdata from PRINT SDK
   PRINTERROR   GetData(
               HPUTIL_STR1023         &out_AlertString,
               PRINT_DATAINF         &out_DataInf);
}

/*****************************************************************************
 *   Internal Methods
 *****************************************************************************/

/*****************************************************************************
 *   ID   = CPrintFunc::CreatePrintSdk()
 *   func   = create CPrintPreset class object
 *****************************************************************************/
PRINTERROR
CPrintFunc::CreatePrintSdk()
{
   if(m_pPrintPreset) return(PRINTERROR_NOERROR);

   try {
      m_pPrintPreset = new CPrintPreset(PRINT_INTERNAL_VERSION);
      if(!m_pPrintPreset) {
         return(PRINTERROR_MEMORY);
      }
   }
   catch(...){
      return(PRINTERROR_MEMORY);
   }
   return(PRINTERROR_NOERROR);
}
/*****************************************************************************
 *   ID   = CPrintFunc::GetData()
 *   func   = get printdata from PRINT SDK
 *****************************************************************************/
PRINTERROR
CPrintFunc::GetData(
   HPUTIL_STR1023      &out_AlertString,
   PRINT_DATAINF      &out_DataInf)
{
   PRINTERROR   lPrintError = PRINTERROR_NOERROR;
   lPrintError = CreatePrintSdk();
   if(lPrintError != PRINTERROR_NOERROR) {
      return(lPrintError);
   }

   lPrintError = m_pPrintPreset->PRINT_GetData(out_AlertString, out_DataInf);
   return(lPrintError);
}
Mein bisheriger Delphi Ansatz folgt dann.

jus 4. Mär 2010 14:39

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Ich muß zugeben, dass ich noch nicht viel Erfahrungen mit DLL habe. Die bisherigen DLL waren meist Windows Standard DLLs, wo man die Funktionen nicht in einem C++Objekt gekapselt waren. Es scheitert schon daran, wenn ich die Funktion "CPrintFunc::GetData" verwenden möchte, benötige ich "CreatePrintSdk()" und weiß nicht wie man sowas nachbauen könnte. :gruebel:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, PRINTSDKHeader, StdCtrls, HPUTIL_COMM;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  PRINT_GetData: function(var out_AlertString: HPUTIL_STR1023; var out_PrintData: PRINT_DATAINF): Integer; cdecl stdcall;
  CPrintPreset: procedure(const IN_LINTERNALVERSION: Integer); cdecl stdcall ;

  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  AlertString: HPUTIL_STR1023;
  PrintData: PRINT_DATAINF;
  Handle: THandle;
  s:String;

begin
   Handle:=LoadLibrary(PChar('PRINTSDK.DLL'));
  if Handle = 0 then begin
    ShowMessage('DLL konnte nicht geladen werden.');
    Exit;
  end;
  @CPrintPreset := GetProcAddress(Handle, PChar('CPrintPreset'));
  if @CPrintPreset = nil then
  begin
    Str(GetLastError, s);
    showmessage('CPrintPreset Fehlernummer: '+s);
  end;

  @PRINT_GetData := GetProcAddress(Handle, PChar('PRINT_GetData'));
  if @PRINT_GetData = nil then
  begin
    Str(GetLastError, s);
    showmessage('PRINT_GetData Fehlernummer: '+s);
  end;

  CPrintPreset(PRINT_INTERNAL_VERSION); //<---------------

  //PRINT_GetData(AlertString,PrintData);
  //Memo1.Lines.Add(IntToStr(PRINTData.Copies.lValue));

  FreeLibrary(Handle);

end;

end.

jus 6. Mär 2010 12:51

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Hat denn keiner ein Idee? Mir würde es auch reichen, wenn jemand weiß, dass man die DLL mit Delphi nicht ansprechen kann.
Lg,
jus

Reinhard Kern 6. Mär 2010 14:05

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Zitat:

Zitat von jus
Hat denn keiner ein Idee? Mir würde es auch reichen, wenn jemand weiß, dass man die DLL mit Delphi nicht ansprechen kann.

Hallo,

damit habe ich auch keine spezielle Erfahrung, nur die allgemeine, dass man im Prinzip alles aus jeder Sprache aufrufen kann, das ist nur eine Frage des Aufwands. Aber der Aufwand ist in dem Fall der Knackpunkt.

Ich würde die Sache so angehen: mit VC++ eine DLL erstellen (auf eine mehr kommt's auch nicht mehr an), die mit den C++-Objekten arbeitet und die gewünschte Funktionalität als einfachen, windowskompatiblen Funktionsaufruf zur Verfügung stellt. C++-Klassen in Delphi nachzubauen ist praktisch nicht möglich, ebensowenig kann man in C++ Delphiklassen verwenden.

Es gäbe auch noch Alternativen über COM-Objekte oder .NET, aber das wäre unnötig kompliziert.

Gruss Reinhard

jus 6. Mär 2010 17:26

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Hallo Reinhard,

zunächst muß sich sagen auf "Reinhard Kern" ist immer Verlaß :thumb: , hast mir schon sehr oft geholfen. Vielen Dank! :)

Zitat:

Zitat von Reinhard Kern
...

Ich würde die Sache so angehen: mit VC++ eine DLL erstellen (auf eine mehr kommt's auch nicht mehr an), die mit den C++-Objekten arbeitet und die gewünschte Funktionalität als einfachen, windowskompatiblen Funktionsaufruf zur Verfügung stellt. C++-Klassen in Delphi nachzubauen ist praktisch nicht möglich, ebensowenig kann man in C++ Delphiklassen verwenden.

...

Daran habe ich heute Nachmittag eigenartiger Weise auch gedacht. Der Weg des geringsten Widerstandes ist in diesem Fall wohl so eine Wrapper-DLL. Ich muß wohl oder übel mich in Visual C++ einarbeiten. :pale:

PS: Für den Fall das einer doch weiß wie man aus Delphi sowas anspricht, bitte nicht zögern das Wissen preiszugeben. Ich denke, dass ich nicht der einzige bin, der jemals so eine C++ DLL in Klassen gekapselt von Delphi anprechen möchte. :wink:

SirThornberry 7. Mär 2010 07:28

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Du hast bei der Anmeldung wie alle dem Verhaltenskodex der DP zugestimmt.
Interessant sollte für dich daraus folgendes sein: 2.3.2.4 - In der Ruhe liegt die Kraft: Kein "Pushen" von Beiträgen :)

jus 7. Mär 2010 09:15

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Zitat:

Zitat von SirThornberry
Du hast bei der Anmeldung wie alle dem Verhaltenskodex der DP zugestimmt.
Interessant sollte für dich daraus folgendes sein: 2.3.2.4 - In der Ruhe liegt die Kraft: Kein "Pushen" von Beiträgen :)

Hallo SirThornberry,

ich habe sicherlich nicht gegen diese 24h Regel verstossen. Mein erster Beitrag zu diesem Thema war am 4.3., erst am 6.3. habe ich weitergefragt. :wink:

Lg,
jus

Luckie 7. Mär 2010 09:25

Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
 
Er bezieht sich auf deinen erst und zweiten Beitrag. Du kannst innerhalb von 24 Stunden deine Beiträge noch editieren.

Klassen in DLLs sind so eine Sache. Diese DLLs kann man nur in der Programmiersprache nutzen, in der sie auch geschrieben sind. Also entweder du schreibst deine Anwendung in C++ oder du schreibst eben einen Wrapper in C++, der normale Funktionen exportiert. Aber so direkt wirst du die DLL in Delphi nicht nutzen können.


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:20 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