Announcement

Collapse
No announcement yet.

Delphi 7 und Delphi 8 .NET DLL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Delphi 7 und Delphi 8 .NET DLL

    Hallo miteinander

    Im Moment schlage ich mich mit Delphi 8 um...
    Habe versucht eine Simple DLL in der .NET umgebung im Delphi 8 zu erstellen. Diese sieht folgendermassen aus:

    ( den Code habe ich von einer WebSite gefunden)

    library Library1;

    {$UNSAFECODE ON}
    {%DelphiDotNetAssemblyCompiler 'c:\program files\common files\borland shared\bds\shared assemblies\2.0\Borland.Delphi.dll'}

    uses
    SysUtils,
    Classes,
    System.Reflection;

    [assembly: information..}

    function D8NET_UserName: String;
    begin
    Result := Environment.UserName;
    end;

    function D8NET_DomainName(): String;
    begin
    Result := Environment.MachineName;
    end;

    exports
    D8NET_UserName, D8NET_DomainName;

    begin
    end.

    Wenn ich die DLL in einem Delphi 7 Projekt einbinde, funktioniert es einwandfrei.
    Sobald ich jedoch einen Parameter übergeben will (function D8NET_DomainName(Test : String) : String)
    dann erhalte ich einen leeren String zurück und es wird eine Exception ausgelöst?!?

    Kann mir jemand weiterhelfen?

    Gruss
    Stefano

  • #2
    Versuche mal String[100] oder so was in der Art. Der String in .Net ist doch eine Klasse? In D7 ist es nur ein Pointer.<br>
    Evtl. noch mal in der Hilfe schauen, dass der D8-String nicht UniCode ist, damit hätte D7 dann ein Problem.<p>
    Schöne Grüße, Mario Noac
    Schöne Grüße, Mario

    Comment


    • #3
      Habe in der Hilfe nachgeschaut,
      D8-String ist als Unicode deklariert.
      Leider scheiterten die Versuche mit AnsiString und ShortString. String[100] akzeptiert D8 nicht.
      Hat du sonst noch eine Idee?

      Gruss
      Stefan

      Comment


      • #4
        Leider nicht, ich kenne mich mit .Net nicht aus. Wie ist es mit einem statisch Array of Char?<p>
        Grüße, Mari
        Schöne Grüße, Mario

        Comment


        • #5
          Hallo,

          ich kann das Problem nicht reproduzieren. Mein Test sieht folgendermaßen aus:

          <b>A) Delphi 8: .NET Unmanaged Export</b>
          <pre>
          <b>library</b> D8LibExport;
          <font color="#003399"><i>{$UNSAFECODE ON}</i></font>
          <br>
          <b>uses</b>
          SysUtils,
          Classes,
          System.Reflection;
          <br>
          <font color="#003399"><i>{$REGION 'Assembly-Attribute'}</i></font>
          [assembly: AssemblyTitle(<font color="#9933CC">'D8NETExport'</font>)]
          [assembly: AssemblyDescription(<font color="#9933CC">'.NET-Assembly von Delphi 7 aus nutzen'</font>)]
          [assembly: AssemblyConfiguration(<font color="#9933CC">''</font>)]
          [assembly: AssemblyCompany(<font color="#9933CC">''</font>)]
          [assembly: AssemblyProduct(<font color="#9933CC">''</font>)]
          [assembly: AssemblyCopyright(<font color="#9933CC">''</font>)]
          [assembly: AssemblyTrademark(<font color="#9933CC">''</font>)]
          [assembly: AssemblyCulture(<font color="#9933CC">''</font>)]
          [assembly: AssemblyVersion(<font color="#9933CC">'1.0.0.0'</font>)]
          [assembly: AssemblyDelaySign(false)]
          [assembly: AssemblyKeyFile(<font color="#9933CC">''</font>)]
          [assembly: AssemblyKeyName(<font color="#9933CC">''</font>)]
          <font color="#003399"><i>{$ENDREGION}</i></font>
          <br>
          <b>function</b> D8NET_UserName: <b>String</b>;
          <b>begin</b>
          Result := Environment.UserName;
          <b>end</b>;
          <br>
          <b>function</b> D8NET_UserNameEx(<b>const</b> sInput: <b>String</b>): <b>String</b>;
          <b>begin</b>
          Result := sInput + <font color="#9933CC">' (ok) '</font>;
          <b>end</b>;
          <br>
          <b>exports</b>
          D8NET_UserName, D8NET_UserNameEx;
          <br>
          <b>begin</b>
          <b>end</b>.
          </pre>
          <b>B) Delphi 7: Win32-Client</b>
          <pre>
          <b>unit</b> D7AppFrmMain;
          <br>
          <b>interface</b>
          <br>
          <b>uses</b>
          Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
          Dialogs, StdCtrls;
          <br>
          <b>type</b>
          TForm1 = <b>class</b>(TForm)
          Button1: TButton;
          Button2: TButton;
          <b>procedure</b> Button1Click(Sender: TObject);
          <b>procedure</b> Button2Click(Sender: TObject);
          <b>private</b>
          <font color="#003399"><i>{ Private-Deklarationen }</i></font>
          <b>public</b>
          <font color="#003399"><i>{ Public-Deklarationen }</i></font>
          <b>end</b>;
          <br>
          <b>var</b>
          Form1: TForm1;
          <br>
          <b>function</b> D8NET_UserName: PChar; <b>stdcall</b>;
          <b>function</b> D8NET_UserNameEx(<b>const</b> s: PChar): PChar; <b>stdcall</b>;
          <br>
          <b>implementation</b>
          <br>
          <font color="#003399"><i>{$R *.dfm}</i></font>
          <br>
          <b>function</b> D8NET_UserName: PChar; <b>external</b> <font color="#9933CC">'D8LibExport.dll'</font>;
          <b>function</b> D8NET_UserNameEx(<b>const</b> s: PChar): PChar; <b>external</b> <font color="#9933CC">'D8LibExport.dll'</font>;
          <br>
          <b>procedure</b> TForm1.Button1Click(Sender: TObject);
          <b>begin</b>
          ShowMessage(D8NET_UserName);
          <b>end</b>;
          <br>
          <b>procedure</b> TForm1.Button2Click(Sender: TObject);
          <b>begin</b>
          ShowMessage(D8NET_UserNameEx(<font color="#9933CC">'Test'</font>));
          <b>end</b>;
          <br>
          <b>end</b>.
          </pre>
          P.S: Wurden die Schnittstellenprozeduren aus der Delphi 8 .NET-Assembly-DLL im Delphi 7-Programm auch wirklich über die Aufrufkonvention <b>stdcall</b> importiert

          Comment


          • #6
            Hallo Miteinander

            Habe heute ein neues Projekt erstellt.
            Aus irgendeinem Grund läuft es jetzt einwandfrei.

            Danke für die Mühe

            Greez
            Stefan

            Comment

            Working...
            X