[Okta Webinar] Learn how to a build a cloud-first strategyRegister Now

  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 427
  • Last Modified:

Passing an array from a VB6 app to a Delphi 5 dll function

I have written a DLL in Delphi 5.0. It contains a math function which performs CRC and some other things with an array of bytes it receives. The function within the Dll returns a WORD. I need to use the dll in both Delphi and Visual Basic 6.0. I've written a separate test app in Delphi that calls the dll function and receives its result. My problem is that I can't seem to figure out how to properly call the function and pass it an array of bytes from a Visual Basic app. I've tried many different tips (not from this forum however) and the results have ranged from simple compile errors in VB to an "exception eefadeH" when I try to call the function within the dll from the VB app. The sample code below is of little value except to illustrate my problem better.  What am I doing wrong? Does anyone have a piece of sample VB code they can send that will clearly illustrate how to call a function within a dll(written in Delphi 5) and pass it an array of bytes?

Here is the code in Delphi:

// Simple test function to add all elements of received array of bytes
FUNCTION add_numbers (test : array of byte) word;
byt_count : integer;
count : integer;
ret_val : word;

BEGIN  // begin of test function
ret_val := 0;
byt_count := High(test);
For count:=  0 to byt_count do
  ret_val := ret_val + test[byt_count];
add_numbers := ret_val;
END;  // end of test function

I have tried it with and without the "stdcall" keyword with seemingly no difference.

This is my DLL Declare in VB:

Declare Function add_numbers Lib "testdll.dll" (bin_data As Byte) As Long

I call the DLL as follows from VB:

Dim Binary_dat(0 to 4) As Byte
Dim dll_answer As Long

dll_answer = 0

Binary_dat(0) = 1
Binary_dat(1) = 0
Binary_dat(2) = 2
Binary_dat(3) = 2
Binary_dat(4) = 1

dll_answer = add_numbers(Binary_dat(0))
Text1.Text = dll_answer

Can anyone help me with this problem? If you would like more details about the problem email me: reubenf@mediaone.net and I'll be glad to send you further information about what I've tried and the code for both the Delphi DLL and the VB App. It seems like such a simple thing. I guess it's just simple enough to confuse the he** out of me!!

Thanks in advance!!
1 Solution
Declare Function add_numbers Lib "testdll.dll" (bin_data() As Byte) As Integer

Your VB declaration of the function and passing the first element as an argument actually sends a pointer to the first element in your array (byte *).

In your delphi program you use the function High(array) which implies that delphi does not use arrays as a simple list of elements, but uses some kind of descriptor, something like:
struct ArrayType
   int LowBound;
   int HighBound;
   byte *Elements; // points to actual data

Your delphi function receives a pointer to this kind of structure.

I suggest that you declare your vb prototype
Declare Function add_numbers Lib "testdll.dll" (bin_data As Byte,byval data_len as int) As Long

and change your delphi function so it will receive a pointer to byte and array length parameters. This will force you to convert the array to pointer to byte in your delphi program.


Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Tackle projects and never again get stuck behind a technical roadblock.
Join Now