Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi c# DLL .NET in DELPHI32 nutzen (https://www.delphipraxis.net/121103-c-dll-net-delphi32-nutzen.html)

hgiel 22. Sep 2008 13:24


c# DLL .NET in DELPHI32 nutzen
 
Hallo,

ich habe ein dokumentierte .NET-DLL, die ich in DELPHI 7 unter Win32 nutzen möchte:

Sie liegt als COM-Wrapper??? bzw. als .Net Assembly ??? vor:

1) meinedll.COM.dll
2) meiendll.COM.tlb
3) meinedll.dll

In der Doku wird von Namensräumen und ihren Eigenschaften gesprochen!

Ich habe keine Ahnung wie ich diese DLLs einbinden und dann nutzen kann ;-((

Um das konkret zu machen:

Ein Namensraum lautet "Version" und besitzt die Eigenschaft "Major" Typ: int

Ich würde nun gerne den Zugriff testen, in dem ich per ButtonClick diese Eigenschaft auslese und als inttostr(Version.Major????) in einem Edit-Feld anzeige!

sirius 22. Sep 2008 13:46

Re: c# DLL .NET in DELPHI32 nutzen
 
Wenn ein COM-Wrapper vorliegt, und dieser das ist, was ich vermute, würde ich mich unter Delphi32 mal ganz schnell darauf (also auf die xxx.COM.DLL) stürzen.

Versuch doch mal die TypBibliothek zu importieren (irgendwo im Delphi-Menu)!

rweinzierl 22. Sep 2008 13:48

Re: c# DLL .NET in DELPHI32 nutzen
 
Hallo


Dot.Net Dlls unterscheiden sich grundsätzlich von normalen Delphi bzw. C++ DLL's aus der WIN32 Welt.

Bei einer Win32.dll stellt die DLL einen Satz an funktionen bereit die im Prenzip von jeder Sprache aus aufgerufen werden können.

Bei einer C# DLL funktiert ganz anders.
Dort liegen die Funkionen als vorkopmpilierter Quellcode vor und benötigen unbedingt die Dot.Net Runtime.

==> Ein normaler Aufruf aus Delphi ist (fast) unmöglich.

Der Standard Weg den Microsoft empfiehlt ist der Umweg über .COM ( bzw AcitveX)
( Hat halt den Nachteil das alles wieder durch die Registry muss!)

Im Internet findet man auch eine Methode die dot.net Runtime komplett in den eigenen Prozess zu laden, und von dort aus die c# DLL wieder anzusprechen ==> Ist aber (meiner Meinung nach) nur etwas für absolute Experten.

Als Bastellösung kann man noch eine Anwendung in c# schreiben ( diese kann die DLL ohne Probleme Laden), und kommuniziert über eine selber ausgedachte Schnittstelle (Socket, Named Pipes, Mapped Memory ....)

von Remobjects gibts ein Produkt names Hydra, auch damit sollte so etwas möglich sein ( noch nicht getestet)

==> An einer besseren Veriante wäre auch ich interessiert.

mfg

Reinhold Weinzierl

hgiel 23. Sep 2008 10:01

Re: c# DLL .NET in DELPHI32 nutzen
 
Hallo,

vielen Dank für die Infos

ich habe die COM.TLB überdie Typbibliothek importiert und auch eine entsprechende UNIT erzeugt, die ich nun in das Programm unter USES impementiert habe:

Ausschnitt aus der NEUEN LIB-Unit:
Delphi-Quellcode:
interface

uses Windows, ActiveX, Classes, Graphics, mscorlib_TLB, OleServer, StdVCL, Variants;
 


// *********************************************************************//
// In dieser Typbibliothek deklarierte GUIDS . Es werden folgende        
// Präfixe verwendet:                                                    
//   Typbibliotheken    : LIBID_xxxx                                    
//   CoClasses          : CLASS_xxxx                                    
//   DISPInterfaces     : DIID_xxxx                                    
//   Nicht-DISP-Schnittstellen: IID_xxxx                                      
// *********************************************************************//
const
  // Haupt- und Nebenversionen der Typbibliothek
  Sts_Db_SiZ_Usb_ComMajorVersion = 1;
  Sts_Db_SiZ_Usb_ComMinorVersion = 0;

  LIBID_Sts_Db_SiZ_Usb_Com: TGUID = '{9D632297-83A7-3DCC-80D1-65E37EE18965}';

  IID_ISiZUsbCOM: TGUID = '{18CD27C2-3EDD-48D0-A2F5-2A7FB2C8E6A5}';
  IID__SiZUsbCOM: TGUID = '{E3C6DF0A-23D3-38D1-810A-ED6BA2C8C241}';
  CLASS_SiZUsbCOM: TGUID = '{FBE6DA18-7BC9-4671-83F9-8D477D3DC39B}';
type

// *********************************************************************//
// Forward-Deklaration von in der Typbibliothek definierten Typen        
// *********************************************************************//
  ISiZUsbCOM = interface;
  ISiZUsbCOMDisp = dispinterface;
  _SiZUsbCOM = interface;
  _SiZUsbCOMDisp = dispinterface;

// *********************************************************************//
// Deklaration von in der Typbibliothek definierten CoClasses            
// (HINWEIS: Hier wird jede CoClass zu ihrer Standardschnittstelle      
// zugewiesen)                                                          
// *********************************************************************//
  SiZUsbCOM = _SiZUsbCOM;


// *********************************************************************//
// Schnittstelle: ISiZUsbCOM
// Flags:    (4416) Dual OleAutomation Dispatchable
// GUID:     {18CD27C2-3EDD-48D0-A2F5-2A7FB2C8E6A5}
// *********************************************************************//
  ISiZUsbCOM = interface(IDispatch)
    ['{18CD27C2-3EDD-48D0-A2F5-2A7FB2C8E6A5}']
    function Get_Version_Major: Integer; safecall;
    function Get_Version_Minor: Integer; safecall;
    function Get_Version_Build: Integer; safecall;


....


Leider kann ich noch nicht auf die Funktionen - z.B. Get_Version_Major - aus der Bibliothek zugreifen:

Fehler "Ungenügende Forward oder external - Deklaration"!!!

Ausschnitt aus meinem Programm:

unit Unit1;

interface

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

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);

  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

function Get_Version_Major: Integer; safecall;

implementation

{$R *.dfm}


procedure TForm1.Button1Click(Sender: TObject);
begin
  showmessage(inttostr(Get_Version_Major));
end;

...
Wahrscheinlich habe ich nur ein Brett vorm Kopf und der Zugriff ist ganz leicht zu bewerkstelligen???

[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen! - Mfg, SirThornberry[/edit]

Alter Mann 23. Sep 2008 19:04

Re: c# DLL .NET in DELPHI32 nutzen
 
Hi,

Entschuldigung: Schon mal mit Interfaces oder ActieX programmiert?

In der Unit einen
Delphi-Quellcode:
initialization
  CoInitialize(nil);

finalization
  CoUninitialize;
schreiben, dann sollte es auch mit dem TLB-Import Funktionieren.

sirius 23. Sep 2008 19:21

Re: c# DLL .NET in DELPHI32 nutzen
 
Zitat:

Zitat von Alter Mann
Hi,

Entschuldigung: Schon mal mit Interfaces oder ActieX programmiert?

In der Unit einen
Delphi-Quellcode:
initialization
  CoInitialize(nil);

finalization
  CoUninitialize;
schreiben, dann sollte es auch mit dem TLB-Import Funktionieren.

Solange die TLB eingebunden ist, ist das für den MainThread bereits erledigt.


Aber mit Interfaces umgehen, musst du noch lernen.
Also (nur eine mögliche Variante):
  1. Du bindest die TLB unter Uses ein (wenn es nicht schon der Fall ist)
  2. Du definierst dir eine Variable vom benötigten Interface (bspw: var myIntf:ISiZUsbCOM)
  3. Du initialisierst an gegebener Stelle das Interface mit Hilfe der CoClass (bsp: myIntf:=coSiZUsbCOM.create
  4. jetzt rufst du die Funktionen auf (myIntf.get_major_version)
Alles andere lässt du erstmal weg. Das wie gesagt nur ein Weg, die TLB bietet auch noch mehr Möglichkeiten. Nebenbei: Das Interface wird automatisch freigegeben, brauchst du dich nicht darum kümmern.

hgiel 24. Sep 2008 15:51

Re: c# DLL .NET in DELPHI32 nutzen
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

vielen Dank für den Input - es ist wahr ich muss mich wirklich mal intensiver um INTERFACE-Prog kümmern ;-(

Die Hinweise von Sirius haben mir insofern geholfen, dass ich nunmehr immerhin schon mal die Funktionen, Properties - rein vom Codevervollständiger - sehen und "nutzen" kann.

Leider gibt es noch eine Fehlermeldung: Klasse nicht registriert! bzw. eine Zugriffsverletzung...!

Hier mal mein Code zum gucken und ausserdem habe ich auch die DLL-Unit mit rangehängt:

unit Unit1;
Delphi-Quellcode:
interface

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

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

var
  Form1: TForm1;

  myIntf1: _SiZUsbCOM; //Interface

  myIntf2: ISizUsbCOM; //Interface *

//  myIntf3: _SiZUsbCOMDisp; //DispInterface - Warnungshinweis plattformspezifisch

//  myIntf4: ISizUsbCOMDisp; //DispInterface - Warnungshinweis plattformspezifisch

implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);

begin
  myIntf1:=coSiZUsbCOM.create; // -> Fehlermeldung Klasse nicht registriert!
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  testzahl: integer;
begin
  testzahl:= myIntf2.Version_Major; // -> Fehlermeldung Zugriffsverletzung
  showmessage(inttostr(testzahl));
  if myIntf2.TrueCryptExists then showmessage('JA') else showmessage('Nein'); // -> hier auch Fehlermeldung Zugriffsverletzung
end;

end.
[edit=SirThornberry]Delphi-Tags gesetzt - nächstes mal bitte selbst machen - Mfg, SirThornberry[/edit]

sirius 24. Sep 2008 17:38

Re: c# DLL .NET in DELPHI32 nutzen
 
Du hast auch soweit alles richtig gemacht. Bis auf, das du globale Variablen definiert hast (myIntfx). Nimm die doch bitte in eine Klasse (zB. zu TForm1 unter private Deklarationen)
Und noch dazu:
Zitat:

Fehlermeldung Klasse nicht registriert!
Tja, sieht so aus, als hättest du die Klasse noch nicht registriert in deinem System. (siehe regsvr32; was normalerweise eine Installation macht)

EDE 25. Sep 2008 18:42

Re: c# DLL .NET in DELPHI32 nutzen
 
Hallo Leute,

ich muss mich hier mal anhängen. :-D

Seit geraumer zeit bin ich SecondLife verfallen und such eine möglichkeit die libsecondlife.dll in die Win32welt von Delphi zu bekommen.

libsecondlife.dll ist in C# für .Net gecodet und OpenSource. Guggst du hier

Alles was passiert das mir Delphi2007 beim Importieren von .Net eine mscorlib_TLB.pas erstellt und sich aufhängt. :(

Ich habe es auch mit Delphi2006 versucht das kann aber kein .Net 2.0

Wenn jemand Rat weis oder vieleicht es schon gemacht hat wer einfach super.

Besten Dank schon mal im Vorraus

gvita 25. Sep 2008 19:58

Re: c# DLL .NET in DELPHI32 nutzen
 
Hallo also mann kann aus manged code eine dll erzeugen mit der auch nicht .net sprachen arbeiten können als ob es eine normale dll wäre.

Guck mal

http://www.codeproject.com/KB/dotnet/DllExport.aspx

Gruß


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:46 Uhr.
Seite 1 von 3  1 23      

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