我有一个在Delphi 7/Windows XP中制作的DLL,我想在Windows上的主机应用程序中静态加载(也是用Delphi制作的).我正在使用这行代码:
procedure Prepare_HTML_Email(var MailMessage : TIdMessage;
const FileAddress, aDetail, aAlarmType : String); stdcall; external DLL_ADDRESS;
Run Code Online (Sandbox Code Playgroud)
哪里DLL_ADDRESS必须是DLL的位置.但此时我遇到了问题.主机应用程序是一个服务,所以它正在运行C:\WINDOWS\System32,但我想把DLL放在另一个目录中,而不是在C:\WINDOWS\System32."external"关键字不允许使用函数跟随它,它只允许一个常量表达式.那么,我怎样才能获得DLL的路径?
Rob*_*edy 11
首先,你不是"静态加载"任何东西.的d在DLL代表动态 ; 无论如何,所有DLL都是动态链接的.静态链接是DCU和OBJ文件包含在程序中的方式.您无法静态链接到DLL.
您正在讨论加载时动态链接,其中OS由于程序的导入表中列出的函数而隐式加载DLL,而不是运行时动态链接,您可以LoadLibrary使用任何所需的方式调用.当您使用该external指令定义您的函数时,您在导入表中创建一个条目,据我所知,相对路径是没有意义的.操作系统使用某个记录的搜索顺序在加载时(和运行时)查找DLL .通常,它是应用程序自己的目录,当前目录,系统目录,Windows目录,然后是PATH环境变量上的其他所有内容.
在您的情况下,当前目录和系统目录是相同的位置,并且您无论如何都无法控制它们.不要将您的DLL放在Windows目录中; 已经有足够的东西不属于那里.
最好的办法是将您的DLL放在与放置服务EXE相同的目录中.如果你不想那么,那么你可以把你的程序引导到该目录中的一个DLL中,然后LoadLibrary使用你想要的任何私有DLL目录加载其他所有内容.
您可以将DLL放在其他位置,然后将该目录添加到PATH环境变量中.但是,该变量是共享资源,因此在更改之前请三思而后行.