|
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.
|