AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-DLL
Thema durchsuchen
Ansicht
Themen-Optionen

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

Ein Thema von jus · begonnen am 4. Mär 2010 · letzter Beitrag vom 7. Mär 2010
Antwort Antwort
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#1

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

  Alt 4. Mär 2010, 14:20
Hallo,

Ich bin schon am verzweifeln , 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.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#2

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

  Alt 4. Mär 2010, 14:39
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.

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.
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#3

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

  Alt 6. Mär 2010, 12:51
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
  Mit Zitat antworten Zitat
Reinhard Kern

Registriert seit: 22. Okt 2006
772 Beiträge
 
#4

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

  Alt 6. Mär 2010, 14:05
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
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#5

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

  Alt 6. Mär 2010, 17:26
Hallo Reinhard,

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

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.

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.
  Mit Zitat antworten Zitat
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#6

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

  Alt 7. Mär 2010, 07:28
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
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
jus

Registriert seit: 22. Jan 2005
343 Beiträge
 
Delphi 2007 Professional
 
#7

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

  Alt 7. Mär 2010, 09:15
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.

Lg,
jus
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8

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

  Alt 7. Mär 2010, 09:25
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  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 20:12 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