Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi 如何在系统路径之外使用dll_Delphi_Dll_Openssl_Indy_Indy10 - Fatal编程技术网

Delphi 如何在系统路径之外使用dll

Delphi 如何在系统路径之外使用dll,delphi,dll,openssl,indy,indy10,Delphi,Dll,Openssl,Indy,Indy10,我制作了一个使用openssl dll的应用程序(libeay32.dll和ssleay32.dll)。 这是印地使用他们,我不直接呼叫DLL 我发现避免安装程序的最简单的解决方法(我只是delpoy一个exe,我同意这种方法)是: 将DLL作为exe的资源 在程序启动时,我将它们解压缩到exe文件夹中 exe使用它们 这是完美的,但我想通过提取临时文件夹中的DLL而不是exe文件夹(在许多情况下是桌面)中的DLL来改进方法 问题是我不知道如何强制应用程序使用临时文件夹中的DLL,因为现在的行为

我制作了一个使用openssl dll的应用程序(
libeay32.dll
ssleay32.dll
)。 这是印地使用他们,我不直接呼叫DLL

我发现避免安装程序的最简单的解决方法(我只是delpoy一个exe,我同意这种方法)是:

  • 将DLL作为exe的资源
  • 在程序启动时,我将它们解压缩到exe文件夹中
  • exe使用它们
  • 这是完美的,但我想通过提取临时文件夹中的DLL而不是exe文件夹(在许多情况下是桌面)中的DLL来改进方法

    问题是我不知道如何强制应用程序使用临时文件夹中的DLL,因为现在的行为是: 如果DLL不在当前目录中,请尝试在系统路径中定义的目录中搜索


    谁知道强制indy在我的临时路径中使用DLL的解决方案?(如“临时注册DLL”)

    您可以使用来操作DLL搜索顺序

    将DLL写入临时文件夹后,请立即自行加载这些DLL。
    这将使Indy的
    LoadLibrary
    在需要时使用您的DLL:

    如果lpFileName不包含路径,并且存在多个路径 已加载具有相同基名称和扩展名的模块,函数 返回首先加载的模块的句柄


    如果您使用的是最新版本的Indy 10,则
    IdSSLOpenSSLHeaders
    单元具有一个公共
    IdOpenSSLSetLibPath()
    函数,用于告诉Indy要查找OpenSSL DLL的自定义文件夹:

    procedure IdOpenSSLSetLibPath(const APath: String);
    

    一种方法是:看看Indy是如何加载那些dll并修改那些*.pas文件并将它们放在您的项目目录中的,那么您就完全脱离困境了。@Computersay我不使用Indy作为黑盒,我并不懒惰,但我记得有一次我读到关于通过“某种注册”在系统路径之外使用dll的可能性它在程序启动时启动。这对我来说是最好的。可能事实上Indy而不是我正在使用这些DLL并不重要。如果您在将DLL写入临时文件夹后立即使用LoadLibrary显式加载这些DLL,这难道不能满足以后的LoadLibrary调用吗?另一个想法是:如果使用SetEnvironmentVariable并将PATH变量更改为指向带有DLL的文件夹…LoadLibrary不会被欺骗而使用新路径吗?未测试想法:)@DavidHeffernan如果lpFileName不包含路径,并且有多个加载的模块具有相同的基名称和扩展名,则函数将返回一个首先加载的模块的句柄。+1,但修改Indy源肯定是最后的手段(这正是我在应用程序中所做的)。“我更喜欢你的解决方案,我认为这是正确的做法。”科比克深思熟虑后,我同意。实际上,我非常喜欢frogb的解决方案,因为我确信它是有效的。我对
    LoadLibrary
    的工作原理有着错误的理解,我只是把这个极好的想法应用到了我的.net p/invoke接口单元中,它提供了对本机库的访问。它使链接更容易。很好。最后我使用了这个答案中建议的技术(
    LoadLibrary
    ),这使我成功了,而不需要升级Indy,这是一件痛苦的事情(每次我尝试升级失败:太多手动操作了)。谢谢,在IdSSLOpenSSLHeaders单元中,我没有idOpenSSLSETlibath(),这意味着我需要更新吗?我有10.5.8.0是的,您需要更新,除非您手动修补现有版本。@RemyLebeau我正在更新,但我应该信任SVN版本吗?哪个版本?谢谢当前的主干版本是10.6.0 rev 5114。@RemyLebeau谢谢,我在重复发帖,不管怎样我真的被卡住了我不记得我是如何按照说明升级indy的没有更及时的升级说明吗?我现在甚至找不到包裹。