【问题标题】:Call and Reuse the DLL functions dynamically动态调用和重用 DLL 函数
【发布时间】:2016-08-01 16:41:46
【问题描述】:

我创建了一个包含一些功能的 DLL 文件,并希望在一个程序的不同功能中多次重用。但是当调用相同的 DLL 函数时,访问冲突错误出现在程序的第二个函数之后。

我目前正在使用 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';

【问题讨论】:

    标签: delphi dll


    【解决方案1】:

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

    1. 使用ShareMem,如新库项目顶部的注释中所述。
    2. 使用标准互操作性技术确保分配和解除分配始终发生在同一个模块中。

    顺便说一句,每次要使用 DLL 时都加载和卸载它是非常浪费的。仅加载一次 DLL。

    此外,我想指出,加密是在二进制数据上运行的,在我看来,您正在通过使用文本来存储一个痛苦的世界。

    【讨论】:

    • 你是对的。我正在使用二进制数据对其进行加密。这只是一个例子。
    • 您传递的是文本而不是二进制文件。
    • 对不起,实际上,EncodeBlowFishString 自定义函数本身正在为我做所有事情。这就是为什么,我传递了 Unicode 字符串,然后它把所有的东西都投射到了里面。它是内联的,然后我决定为所有这些自定义函数创建一个 DLL
    • 我认为这就是问题所在。您失去了对文本编码的控制。如果是我,我会明确指定编码。无论如何,这是一个旁白。我处理了你的实际问题。
    • @david-heffeman 我在 DLL 中添加了一个包装器,以便它完成大部分工作,而不是在任何调用者的过程或函数范围之外重用相同的函数。我在stackoverflow中提到了你的例子。因为我是从 Pascal Lazarus 来到 Delphi,所以有些事情比较棘手。感谢您的帮助
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多