Sonntag, 12. Februar 2012

entwickler.com Magazine Konferenzen Akademie Entwickler-Forum Jobbörse Bücher
Software & Support Media

Webhosting mit Host Europe
Delphi 7 und Delphi 8 .NET DLL

Frage: Ich habe versucht, eine einfache DLL in der .NET-Umgebung mit Delphi 8 zu erstellen, die Funktionen für eine mit Delphi 7 kompilierte Win32-Anwendung bereitstellt. Wenn ich die DLL in einem Delphi 7 Projekt einbinde, funktioniert es einwandfrei. Sobald ich jedoch in der Delphi 7-Anwendung einen String-Parameter an die DLL-Funktion übergeben will, erhalte ich einen leeren String zurück und es wird eine Exception ausgelöst! Kann mir jemand weiterhelfen?

Antwort: Ich kann das Problem nicht reproduzieren, denn die CLR von .NET kümmert sich um alle notwendigen Datentyp-Anpassungen automatisch. Wenn die von der .NET-Assembly exportierten Schnittstellenprozeduren im Delphi 7-Programm über die Aufrufkonvention stdcall importiert werden, ist der Aufruf erfolgreich, wie der folgende Test zeigt:

A) Delphi 8: .NET Unmanaged Export

library D8LibExport;
{ UNSAFECODE ON}

uses SysUtils, Classes, System.Reflection;
{ REGION 'Assembly-Attribute'} [assembly: AssemblyTitle('D8NETExport')] [assembly: AssemblyDescription('.NET-Assembly von Delphi 7 aus nutzen')] [assembly: AssemblyConfiguration('')] [assembly: AssemblyCompany('')] [assembly: AssemblyProduct('')] [assembly: AssemblyCopyright('')] [assembly: AssemblyTrademark('')] [assembly: AssemblyCulture('')] [assembly: AssemblyVersion('1.0.0.0')] [assembly: AssemblyDelaySign(false)] [assembly: AssemblyKeyFile('')] [assembly: AssemblyKeyName('')] { ENDREGION}
function D8NET_UserName: String; begin Result := Environment.UserName; end;
function D8NET_UserNameEx(const sInput: String): String; begin Result := sInput + ' (ok) '; end;
exports D8NET_UserName, D8NET_UserNameEx;
begin end.
B) Delphi 7: Win32-Client
unit D7AppFrmMain;

interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;
type TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end;
var Form1: TForm1;
function D8NET_UserName: PChar; stdcall; function D8NET_UserNameEx(const s: PChar): PChar; stdcall;
implementation
{ *.dfm}
function D8NET_UserName: PChar; external 'D8LibExport.dll'; function D8NET_UserNameEx(const s: PChar): PChar; external 'D8LibExport.dll';
procedure TForm1.Button1Click(Sender: TObject); begin ShowMessage(D8NET_UserName); end;
procedure TForm1.Button2Click(Sender: TObject); begin ShowMessage(D8NET_UserNameEx('Test')); end;
end.






Software & Support Media GmbH