动态调用和重用DLL函数

时间:2016-08-01 16:41:46

标签: delphi dll

我创建了一个带有一些函数的DLL文件,并希望在不同的函数中多次在程序中重用。但是当调用相同的DLL函数时,程序的第二个函数之后出现Access-violation错误。

我目前正在使用GetProcAddress。例如:

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;

还有其他函数正在加载库并多次调用这些DLL函数。此外,在相同的过程/函数中,我们在(IF Else)条件下多次调用这些DLL函数。

在程序的早期部分,我试图检查DLL文件是否存在。另外,我尝试直接加载函数作为另一种选择:

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';

1 个答案:

答案 0 :(得分:3)

您违反了DLL的内存分配规则。返回值由被调用者分配,但由调用者释放。两种解决方案:

  1. 使用ShareMem,如新图书馆项目顶部的评论中所述。
  2. 使用标准互操作性技术确保分配和取消分配始终在同一模块中进行。
  3. 另外,每次要使用它时加载和卸载DLL都非常浪费。仅加载DLL一次。

    此外,我想指出加密是对二进制数据进行操作的,在我看来,你通过使用文本来处理痛苦的世界。