Announcement

Collapse
No announcement yet.

VB und Delphi-DLL

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

  • VB und Delphi-DLL

    Hi *,<p>
    für meinen VB-Kollegen habe ich eine Delphi-DLL geschrieben:
    <pre>
    type
    Str255 = array[0..255] of Char;
    function GetVal(x, y, z: Word; p: PChar): Str255; stdcall;
    </pre>
    Der Aufruf aus VB sieht folgendermaßen aus:
    <pre>
    Public Declare Function GetVal Lib "GetVal.dll" (ByVal a As Integer, ByVal b As Integer, ByVal c As Integer, ByVal s As String) As String
    str = GetVal(1, 2, 3, "...")
    </pre>
    Beim Aufruf der DLL-Funktion kommt ein Fehler "Die Anweisung in ... verweist auf Speicher in ... Der Vorgang read konnte nicht auf dem Speicher durchgeführt werden."<p>
    Was machen wir falsch?<p>
    Danke im voraus und Grüße,<br>
    Reimund

  • #2
    Ohne das wirklich zu wissen: Kann es an der Verwendung von String liegen. Soweit ich weiß gibt es sogar Probleme Delphi-DLLs im BCB zu verwenden, sobald Strings ins Spiel kommen. Die Stringtypen sind wohl inkompatibel...

    Wenn ich in meinem BCB eine neues DLL-Projekt anlege, wird da auch ein Text eingefügt, dass Strings (als Parameter oder als Rückgabewert) nur verwendet werden können, wenn die dynamische RTL verwendet wird.

    Grüße Joche

    Comment


    • #3
      Hallo,

      die von einer Delphi-DLL exportierten Funktionen werden mus der Aufrufkonvention <b>stdcall</b> gekennzeichnet, außerdem dürfen Strings nur als <b>PChar</b> (nullterminierte Windows-Strings) verwendet werden:
      <pre><b>library</b> DelphiVBA;
      <br>
      <b>uses</b>
      SysUtils, Classes, Windows;
      <br>
      <font color="#003399"><i>{$R *.RES}</i></font>
      <br>
      <b>resourcestring</b>
      cFmt = <font color="#9933CC">'Word: %d; PChar: %s; DWORD%d; var TDataTime: %s; var DWORD: %d'</font>;
      <br>
      <b>function</b> TestDLL(dWord : WORD; pPChar: PChar; dwDWORD: DWORD;
      <b>var</b> dtDateTime: TDateTime;
      <b>var</b> dwVarDWORD: DWORD): Integer; <b>stdcall</b>;
      <b>begin</b>
      MessageBox(0, PChar(Format(cFmt, [dWord, pPChar, dwDWORD,
      DateTimeToStr(dtDateTime), dwVarDWORD])),
      <font color="#9933CC">'Parameter-Test'</font>, 0);
      Result := 1;
      <b>end</b>;
      <br>
      <b>exports</b>
      TestDLL;
      <br>
      <b>begin</b>
      <b>end</b>.
      </pre>
      VB übergibt Parameter in der Voreinstellung als Referenz (Verweis auf die Variable), während Delphi im Gegensatz dazu Parameter in der Voreinstellung als Wert übergibt. Daher gilt die folgende Umsetzung: <i>PChar = ByVal x As String</i>

      Immer dann, wenn in Delphi kein <b>var</b>-Kennzeichner verwendet wird, muss in VBA die Deklaration über <b>ByVal</b> verwendet werden. Das folgende Beispiel demonstriert dies:
      <pre>Declare Function TestDLL Lib &quot;E:\Ablage\DelphiVBA.DLL&quot; _
      (ByVal dWord As Integer, _
      ByVal pPChar As String, _
      ByVal dwDWORD As Long, _
      dtDateTime As Date, _
      dwVarDWORD As Long) As Long
      <br>
      Sub DelphiVBA()
      <br>
      Dim dtDate
      Dim dwVDWORD
      <br>
      dtDate = &quot;09.02.2001&quot;
      dwVDWORD = 123
      iReturn = TestDLL(11, &quot;Das ist ein Test&quot;, 12, dtDate, dwVDWORD)
      MsgBox iReturn
      <br>
      End Sub
      </pre&gt

      Comment


      • #4
        Hi,<p>
        erstmal danke für die Antwort.<br>
        Eigentlich machen wir bereits all das, was Du in Deiner Antwort beschreibst.<br>
        Mit <pre>
        type
        Str255 = array[0..255] of Char;
        </pre>
        versuche ich dafür zu sorgen, dass ich einen nullterminierten String zurückgeben kann.<br>
        Die Funktion in der DLL weist auch PChar und stdcall auf.<br>
        Auch die Deklaration in VB (mit byVal) sollte passen.<br>
        Trotzdem kommt der Fehler beim Aufruf der DLL-Funktion aus VB heraus.<p>
        Grüße, Reimun

        Comment


        • #5
          Guten Tag,
          <P>
          Ihre vollständige Betrachtung der Feinheiten Delphi-VBE habe ich schon zwei Mal benutzt. Danke sehr!<P>
          Und jetzt bin ich zum nächsten Mal gekommen, Ihre Hilfe zu bitten.<P>
          Ich kann nicht ein Array in VB Excel an Prozedur in DLL übergeben.<P>
          Die Suche war unerforderlich.
          <P>
          Danke im Voraus.<BR>
          Almidag

          Comment

          Working...
          X