Announcement

Collapse
No announcement yet.

Stringrückgabe aus DLL an VB6 Anwendung

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

  • Stringrückgabe aus DLL an VB6 Anwendung

    Ich habe eine Funktion geschrieben, die als Rückgabewert den Datentyp PCHAR verwendet. Wenn ich nun diese Funktion, die ich mit DECLARE in VB eingebunden habe, aufrufe, dann bekomme ich ein "Access violence". Der Absturtz passiert genau dann, wenn die Funktion beendet ist, und das Ergebnis zurückgegeben werden soll. Was mache ich falsch?

  • #2
    Hallo,

    das folgende Beispiel demonstriert die Vorgehensweise:

    <b>Delphi-DLL</b> <br>
    Die von einer Delphi-DLL exportierten Funktionen werden mit der Aufrufkonvention <b>stdcall</b> gekennzeichnet, außerdem dürfen Strings nur als <b>PChar</b> (nullterminierte Windows-Strings) verwendet werden.
    <pre>
    library DelphiVBA;

    uses
    SysUtils, Classes, Windows;

    {$R *.RES}

    resourcestring
    cFmt = 'Word: %d; PChar: %s; DWORD%d; var TDataTime: %s; var DWORD: %d';

    function TestDLL(dWord : WORD; pPChar: PChar; dwDWORD: DWORD;
    var dtDateTime: TDateTime;
    var dwVarDWORD: DWORD): Integer; stdcall;
    begin
    MessageBox(0, PChar(Format(cFmt, [dWord, pPChar, dwDWORD,
    DateTimeToStr(dtDateTime), dwVarDWORD])),
    'Parameter-Test', 0);
    Result := 1;
    end;

    exports
    TestDLL;

    begin
    end.
    </pre>
    <b>VB/VBA</b><br>
    Immer dann, wenn in Delphi kein var-Kennzeichner verwendet wird, muss in VBA die Deklaration über ByVal verwendet werden. Außerdem ist Integer in VBA noch immer 16-Bit, daher muss Long als Datentyp verwendet werden, wenn ein Delphi-Integer übergeben wird.
    <pre>
    Declare Function TestDLL Lib "E:\Ablage\DelphiVBA.DLL" _
    (ByVal dWord As Integer, _
    ByVal pPChar As String, _
    ByVal dwDWORD As Long, _
    dtDateTime As Date, _
    dwVarDWORD As Long) As Long

    Sub DelphiVBA()

    Dim dtDate
    Dim dwVDWORD

    dtDate = "09.02.2001"
    dwVDWORD = 123
    iReturn = TestDLL(11, "Das ist ein Test", 12, dtDate, dwVDWORD)
    MsgBox iReturn

    End Sub
    </pre&gt

    Comment


    • #3
      Hallo,

      ich habe ein ähnliches Problem.

      alllerdings nützt mir der Rüchgabestring nichts, wenn er nur in einer Messagebox zurückgegeben wird.

      Ich hätte ihn gerne als Variable in VB oder Access benutzt.

      Mit Delphi funktioniert es schon, nur habe ich keine Ahnung, wie ich dies in VB bewerkstelligen soll.

      procedure TForm1.Button2Click(Sender: TObject);
      var x,y : string;
      scCode : array[0..99] of Char;

      begin
      FillChar(scCode, SizeOf(scCode), 0);
      x := pchar('edit');
      y := inttostr(EncryptPwd3 (pchar('Edit1'),pchar('Edit2'),scCode));
      label2.caption := scCode;
      end;

      library cryptor;
      uses
      SysUtils,
      Classes,
      Windows;

      type CString = string[255];
      var

      S: array[0..79] of char;

      function EncryptPwd3( const Pwd_, Key_: PChar; cCode: PChar): Integer; stdcall; export;
      var
      i, m : Integer;
      tmp : Word;
      Pwd,
      Key : String;
      begin
      StrPCopy(cCode, Pwd);
      Result := 0;
      end;

      exports
      EncryptPwd2 index 3;

      begin
      end.

      VB ?

      Private Declare Function EncryptPwd3 Lib "cryptor.dll" (ByVal pwd_ As String, ByVal key_ As String, ByRef cCode As String) As Long

      Private Sub Befehl4_Click()
      Dim pwd_
      Dim key_

      pwd_ = "Edit1"
      key_ = "Edit2"
      scCode = String(100, "0")
      X = EncryptPwd3(pwd_, key_, scCode)

      MsgBox cCode
      End Su

      Comment

      Working...
      X