Satyendra Shukla
Satyendra Shukla

Reputation: 43

Call and Reuse the DLL functions dynamically

I have created a DLL file with some functions and wish to reuse in a program multiple times in its different functions. But the Access-violation error comes after 2nd function of the program when calls the same DLL functions.

I'm currently using GetProcAddress. For example:

function xyz:boolean
var
   dllHandle : cardinal;
   EnBFStr : TEnBFStr;
   StrToHex : TStrToHex;
   Encodeddata , HexString : UnicodeString;

   begin
     dllHandle := LoadLibrary('Utilities.dll') ;
     if dllHandle <> 0 then
     begin
        Encodeddata:='Sample';
        @EnBFStr := GetProcAddress(dllHandle, 'EncodeBlowFishString') ;
        @StrToHex := GetProcAddress(dllHandle, 'UniStrToUniHexStr') ;
        if Assigned (EnBFStr) then
           Encodeddata:=EnBFStr('Key','Text') ; //Sample would be replaced

        if Assigned (StrToHex ) then
           HexString :=StrToHex(Encodeddata) ; //call the function

        FreeLibrary(dllHandle) ;
 end;

There are other functions which is loading the library and calling these DLL functions multiple times. Also, within the same procedure/function, we are calling these DLL functions multiple times in (IF Else) conditions.

In earlier part of the program, I have tried to check for the DLL file is present. Also, I tried to directly load the functions as another alternative:

function EncodeBlowFishString (Const Key:UnicodeString; Const DecodedString:UnicodeString; ): UnicodeString; stdcall;
external 'Utilities.dll' name 'EncodeBlowFishString';

function UniStrToUniHexStr(Const aString:UnicodeString): UnicodeString; stdcall;
external 'Utilities.dll';

Upvotes: 0

Views: 2465

Answers (1)

David Heffernan
David Heffernan

Reputation: 612794

You are breaking the rules of memory allocation for DLLs. The return value is allocated by the callee but deallocated by the caller. Two solutions:

  1. Use ShareMem as described in the comment at the top of a new library project.
  2. Use standard interoperability techniques to ensure that allocation and deallocation always happens in the same module.

As an aside it is greatly wasteful to load and unload a DLL each time you want to use it. Load the DLL once only.

Furthermore I would like to point out that encryption operates on binary data and in my view you are storing up a world of pain by working instead with text.

Upvotes: 3

Related Questions