怎么静态调用dll? 注意: dll文件是一个相对路径(相对exe文件夹)

如何静态调用dll? 注意: dll文件是一个相对路径(相对exe文件夹)
不能将dll放在system32或windows目录下,需要有代码, 否则无分,,谢谢!

------解决方案--------------------
AnsiString FilePath;
AnsiString DllFilePath;
FilePath = Application->ExeName;
FilePath = ExtractFilePath(FilePath);
DllFilePath = FilePath +DLL文件名
ShowMessage(DllFilePath);

------解决方案--------------------
一声叹息。
------解决方案--------------------
探讨

一声叹息。

------解决方案--------------------
@毛毛:
楼主都说了想静态调用DLL,并且这个DLL文件不在EXE当前目录,也不能放在System32或Windows目录下。
楼上哥几个还在叽叽歪歪整那没用的。光顾着抢分了,题目都不仔细看。不得不叹息一下。

我记的前些日子有一个网友也提过类似问题,不知道是不是楼主。

如果楼主可以容忍修改path变量。。。
------解决方案--------------------
不能放在系统目录,不能放在当前目录,不能修改path
则此题无解。
------解决方案--------------------
就是我问的,呵呵!澄清一下,我可不是楼主。
------解决方案--------------------
其实没猜错,可能是同名DLL, 嘿嘿, 放在各个目录下,但是功能不一样.
要不 人家可以直接生成到一个目录下了. 那就不用这么麻烦了.
------解决方案--------------------
恩, 1)在VC里面,直接编译成LIB了, BCB里面的哪个编译LIB我没试验过,不过估计一样的.
2) 以前曾经弄过一个很蹩脚的硬件解决方案。 从和我系统对接的程序只看到一个DLL(接口一样),
我自己在下面弄了一个虚拟设备类似的, 来配置各个不同厂家过来的设备. 然后就成这个摸样了.
使用的时候先配置是哪个厂家的, 我就把哪个厂家对应的DLL 复制到当前程序路径上. 



探讨
引用:

一声叹息。

妖哥叹息啥呀?前不久一弟兄也问过这个问题,貌似无解~~本来偶的想法是尝试一下能否通过manifest文件来指定DLL的位置,就象VC的运行时库那样,结果试验木有成功~~

------解决方案--------------------
实际上, 这个问题大家都可能经常遇到。 我最近就遇到需要根据程序运行时的结果, 来调用不同版本的第三方的SDK DLL 。 关键是这个 DLL 的三个版本,都是同一个名字。 放一个目录里面,肯定不行。 解决的方法有几种:

1、不同版本的 DLL 库, 改名字。 版本1为 XXXX1.DLL , 版本2为 XXXX2.DLL , 版本3为 XXXX3.DLL ,然后在程序中, 直接通过 LOADLIBRARY 及 FREELIBRARY 来调用。 

2、不改名字,但是放在不同的子目录中, 调用方法同上。 

3、改DLL名字,然后修改对应的 LIB 文件中的 导出库 名字。 例如, XXXX.DLL 修改为 AAAA.DLL , 并且在 LIB 中,修改 XXXX 为 AAAA. YYYY.DLL 修改为 BBBB.DLL, 并且在 LIB 中修改 YYYY 为 BBBB
------解决方案--------------------
第三种方法的好处,就是可以使用 lib 导入文件。 不过, 可能还是存在问题, 因为编译器连接时,可能会发现同一函数的多个lib 导入,从而导致连接失败。这种方法应该适用于函数名称不一致的情况吧。 我没这样做过。

所以,还是推荐采用 方法 1 2
------解决方案--------------------
馊主意

再做个launch.exe用ShellExecute去调用你的主程序main.exe
ShellExecute第5个参数指定一下路径.

用批处理也可以还简单,只不过"看上去不专业"

set path=%path%;%cd%\mydll
demo.exe

C/C++ code

// launch.exe
#include <vcl.h>
#pragma hdrstop
//---------------------------------------
WINAPI WinMain(HINSTANCE, HINSTANCE, LPSTR, int)
{
    try
    {
         Application->Initialize();
         Application->Run();
         String dir = "D:\\Bin\\mydll";
         ShellExecute(NULL,NULL,"demo.exe",NULL,dir.c_str(),SW_SHOW);
    }
    catch (Exception &exception)
    {
         Application->ShowException(&exception);
    }
    catch (...)
    {
         try
         {
             throw Exception("");
         }
         catch (Exception &exception)
         {
             Application->ShowException(&exception);
         }
    }
    return 0;
}

------解决方案--------------------
windows核心编程提到过 DLL延迟加载 在使用dll的时候dll才真正的加载进来。

可以先运行exe,然后调用API设置PATH路径,然后直接使用dll的函数就可以了

VC下我实现过。Delphi不知道提供没提供这样的编译选项