怎么静态调用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 复制到当前程序路径上.
------解决方案--------------------
实际上, 这个问题大家都可能经常遇到。 我最近就遇到需要根据程序运行时的结果, 来调用不同版本的第三方的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
不能将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 复制到当前程序路径上.
------解决方案--------------------
实际上, 这个问题大家都可能经常遇到。 我最近就遇到需要根据程序运行时的结果, 来调用不同版本的第三方的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不知道提供没提供这样的编译选项