Announcement

Collapse
No announcement yet.

Aufruf in vb.net eines Delphi dll

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

  • Aufruf in vb.net eines Delphi dll

    Hallo,

    Wir sollten Delphi dll's in vb.net nutzen können. Habe mir mal kleine Beispiele gemacht. Die Proceduren 'OnlyHallo' und 'GetHallo' funktionieren. Aber 'HalloExtend' ergibt die Fehlermeldung: "Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben. Dies ist häufig..."

    Das Delphidll:
    library DelphiForVB;
    uses
    SysUtils,
    Dialogs,
    Classes;
    {$R *.res}
    procedure OnlyHallo; stdcall;
    begin
    ShowMessage('Hello world')
    end;
    function GetHallo: PChar; stdcall;
    begin
    result:= PChar('Hallo from dll')
    end;
    procedure HalloExtend(var s: PCHar); stdcall;
    begin
    ShowMessage('Hallo '+s)
    end;
    exports
    OnlyHallo,
    GetHallo,
    HalloExtend;
    begin
    end.

    und mein vb:
    Imports System.Runtime.InteropServices
    Public Class Form1
    Declare Sub OnlyHallo Lib "DelphiForVB.dll" ()
    Declare Function GetHallo Lib "DelphiForVB.dll" () As String
    Declare Sub HalloExtend Lib "DelphiForVB.dll" (ByVal s As String)
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    OnlyHallo()
    End Sub
    Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click
    TextBox1.Text = GetHallo
    End Sub
    Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click
    HalloExtend(TextBox2.Text)
    End Sub
    Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
    Close()
    End
    End Sub
    End Class

    Kann mir jemand weiterhelfen?

    Grüsse aqua

  • #2
    dort scheinen zugriffsrechte auf die funktion nicht zu stimmen
    genaueres kann ich dir auch nicht sagen aber ich denke du könntest deine lösung unter
    http://www.google.de/search?hl=de&q=...le-Suche&meta=
    finden
    Muss ich mir das ganze jetzt wie eine Klasse vorstellen, so wie du das einbindest?
    Hast du eine Möglichkeit, die Funktion anders einzubinden/aufzurufen?

    MfG

    Comment


    • #3
      Danke für den link. Bin aber noch nicht fündig geworden.

      Der Code ist so wie angegeben mit Delphi zu DelphiForVB.dll compiliert und
      das vb besteht lediglich aus einem Form (siehe form1.jpg). Das ganze läuft unter Vista! (vielleicht liegt hier das Problem?)

      Mfg
      Attached Files

      Comment


      • #4
        Hallo,

        procedure HalloExtend(var s: PCHar); stdcall;
        ...
        Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben
        wenn die Delphi-DLL den Datentyp PCHar (d.h. einen Zeiger auf einen nullterminierten String) verwendet, muss die .NET-Anwendung mindestens einen StringBuilder anstelle eines einfachen String deklarieren. In der Delphi-DLL darf die übergebene Zeichenkette nur über die Funktionen wie StrCat oder StrPCopy geändert werden.

        Wenn das nicht ausreicht (d.h. der Aufruffehler bleibt), muss die DLL-Funktion über das MarshalAs-Attribut für den Typ LPStr (Long Pointer to String) gekennzeichnet werden, wie das Beispiel für eine andere Delphi-DLL zeigt:

        Code:
        Public Declare Ansi Function DoWork _
          Lib "C:\Ablage\DelphiStringPointer.dll" ( _
          <MarshalAs(UnmanagedType.LPStr)>) As Integer
        Zuletzt editiert von Andreas Kosch; 29.09.2007, 13:28.

        Comment


        • #5
          Hallo Andreas,

          Danke für deinen Typ, er hat mich über Umwegen zur simplen Lösung gebracht:
          ByVal in vb.net entspricht in Delphi keiner Dekleration und
          ByRef in vb.net entspricht in Delphi var
          Ich Depp!

          Comment

          Working...
          X