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?
Announcement
Collapse
No announcement yet.
Stringrückgabe aus DLL an VB6 Anwendung
Collapse
X
-
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>
-
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
Comment