![]() |
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:
In der Beispielanwendung wird die DLL folgendermaßen angesprochen:
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(); };
Code:
Mein bisheriger Delphi Ansatz folgt dann.
#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); } |
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. |
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 |
Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
Zitat:
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 |
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:
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: |
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: ![]() |
Re: Bitte um Hilfe bei Übersetzung C++->Delphi mit Fremd-
Zitat:
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 |
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 08:07 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