Delphi DLL is used in VB

Hello, I have a DLL file written in Delphi. Here is one of its functions (the function is included in the 'export' clause):

function EncryptStr(TheStr: String): String; stdcall; export;
begin
   Result := 'asd';
end;

Now I want to use this funcion in VB.

Public Declare Function EncryptStr Lib "InstStore" (ByRef TheStr As String) As String

And I want to use it.

MsgBox EncryptStr("Test")

But an error message is shown "Bad DLL calling convention". Why?
LVL 1
slaviknAsked:
Who is Participating?
 
leonidnConnect With a Mentor Commented:
function TestFunc: PChar; stdcall; export;
var
   Test: String;
begin
   Test := 'qwe';
   Result := PChar(Test);
end;
0
 
slaviknAuthor Commented:
P.S.  This DLL also includes other functions which work fine. This is the only function which doesn't work (and it is the only one which returns a String value, but not the only one who has a String value as a parameter).
0
 
slaviknAuthor Commented:
Please don't answer!
0
The 14th Annual Expert Award Winners

The results are in! Meet the top members of our 2017 Expert Awards. Congratulations to all who qualified!

 
slaviknAuthor Commented:
Sorry, I had to check something.
Please DO answer.
0
 
Lee_NoverCommented:
you should use PChar instead of string to make it compatible

an example how to make functions that return strings:

function GetSubject(Subject: PChar; Size: Integer): Integer; stdcall;
var tmp: string;
begin
     Result:=-1;
     if not Loaded then exit; // if you have to check something
     tmp:=yourstring;
     try
        Result:=Length(tmp);
        StrPLCopy(Subject, tmp, Size);
     except
        Result:=-2;
     end;
end;

and the vb part:

Public Declare Function GetSubject Lib "lnEMLpars.dll" (ByVal Body As String, ByVal Size as Long) As Long


Public Function EML_GetSubject() As String
Dim s As String
Dim l As Long
   
    s = Space(255) ' allocate a buffer
    l = GetSubject(s, 255)
    If l < 1 Then
        Exit Function
    End If
    EML_GetSubject = Left(s, l)

End Function


this is the correct way to use strings with dlls in delphi and VB (just like other MS API functions)
0
 
Lee_NoverCommented:
oh .. you should also check if your buffer was large enough:

Public Function EML_GetSubject() As String
Dim s As String
Dim l As Long
   
   s = Space(255) ' allocate a buffer
   l = GetSubject(s, 255)
   If l < 1 Then
       Exit Function
   End If
   If l > 255 then s = Space(l)
   l = GetSubject(s, l)
   EML_GetSubject = Left(s, l)

End Function
0
 
slaviknAuthor Commented:
Sorry. Your suggestions didn't help. I changed String to PChar, but still it didn't work.

Any clues?
0
 
slaviknAuthor Commented:
Your function works (because it doesn't return a String value. Try to write a function which will return a String value ...and please post it here.
0
 
slaviknAuthor Commented:
Ok, I understand. First I have to save the result as a String and then to convert it to PChar.

Thanks!
0
 
Lee_NoverCommented:
what do you mean it didn't work ?
did you use the code I wrote ?
what didn't work ? it didn't compile or it didn't work in runtime
bah ...
0
 
slaviknAuthor Commented:
Your code worked. BUT, the result was not a String value. I already had functions one of whose parameters was a String value.

The problem I had was to return a String (or a PChar) value.

Am I clear?
0
 
Lee_NoverCommented:
aha then say so in the first place
anyway I showed the right way of how functions dealing with strings should be made and used
when you'll learn more about memory you'll see
0
 
slaviknAuthor Commented:
Please read my comment right after the question. Here it is: "This DLL also includes other functions which work fine. This is the only function which doesn't work (and it is the only one which returns a String value, but not the only one who has a String value as a parameter)."

leonidn understood that the problem was in returning a String value.
0
 
Lee_NoverCommented:
I also understood that, but you never should return a string from a dll funtion
when you run into trouble you will see why
0
All Courses

From novice to tech pro — start learning today.