BCB的EXE能否静态调用子目录下的DLL?

jaffy 2010-08-06 10:53:43
现在由于某种需求,DLL不能和EXE放在一个目录下;也不希望将DLL放在System32目录下。
并且之前DLL都是静态调用使用的,现在问题是能否不改变调用方式就通过建立一个子目录方法
让DLL和EXE不在同一目录,并且也可以静态调用。
...全文
370 35 打赏 收藏 转发到动态 举报
写回复
用AI写文章
35 条回复
切换为时间正序
请发表友善的回复…
发表回复
yf2100 2010-09-13
  • 打赏
  • 举报
回复
把你的dll用implib生成lib放置在C:\Program Files\Borland\CBuilder6\Lib目录下
  • 打赏
  • 举报
回复
延迟加载dll,随便dll放那个目录。


windows核心编程提到过 DLL延迟加载 在使用dll的时候dll才真正的加载进来。
可以先运行exe,然后调用API设置PATH路径,然后直接使用dll的函数就可以了

CCED136 2010-08-27
  • 打赏
  • 举报
回复
好像刚才看到过类似的帖子, 方法也有。分2种情况

1、 DLL 你自己写的。这个最简单, 工程选项里面,有个 lib dll 输出名字的前导设定, 好像记得是 pre...什么的东西。 你在那里把 前导写成一个路径,例如 dir\mydll.dll 。 这样,生成的 LIB 中就会指明程序需要的 DLL 文件是在 DIR 子目录中了。 具体做法很多年没用过了, 自己研究一下就行,应该很简单。

2、DLL 不是自己写的。 这个稍微麻烦一点, 需要用 16 进制编辑工具,修改 LIB 文件中默认的导出库名称。 通常情况下, A1234567.DLL 配对的 A1234567.LIB 中, 会有一个导出函数库的名字,通常是 A1234567 , 用来指明 LIB 中引入的函数,都是在 A1234567.DLL 中实现的。
那么,此时你可以将 LIB 中的这个 A1234567, 修改为 DIR\A123 , 这样,你就可以把 A1234567.DLL 放到子目录 DIR 中, 并且需要改名为 A123.DLL 。 这是因为 DIR\A123 的长度不能超过 A1234567 库名字的长度。可以短,但是不能超过。

我现在晓得的就这2种方法了。楼主不妨试试, 如果不行也不能怪我呦。

truelove7283159 2010-08-26
  • 打赏
  • 举报
回复
今天发现以前写的一个程序不能跑了,一查看,原来是打系统补丁把DLL位置给我变了,
顺便想到这个帖子,给个方案, 简单的. LZ看看行不.

HINSTANCE Shell32Dll = NULL;

//1 加载内存中的dll。
自己搜了, 很容易找到,不是回答这个帖子的重点. 重点就是4.

//2可以加载已经运行的程序。
//Shell32Dll = GetModuleHandle(mSystemPath);//LoadLibrary("Shell32.dll");

//3加载固定位置的程序
// Shell32Dll = LoadLibrary("C:\\WINDOWS\\ServicePackFiles\\i386\\riched20.dll");

//4加载本程序目录下的程序(caller目录下的),
char mSystemPath[MAX_PATH+1];
memset(mSystemPath,0x00,MAX_PATH+1);
GetModuleFileName(NULL, mSystemPath, MAX_PATH);
AnsiString NewFileName = ExtractFilePath(mSystemPath)+"common\\riched20.dll";

Shell32Dll = LoadLibrary(NewFileName.c_str());
if (Shell32Dll)
{
ShowMessage("我爱凤姐");
}
jaffy 2010-08-10
  • 打赏
  • 举报
回复
[Quote=引用 26 楼 truelove7283159 的回复:]
1.DELPHI提供了,BCB基本上都有(不能说一定有:) ).
2. 你使用DLL 方式是每次程序更新发布一个DLL 就好了.
使用LIBRARY呢,是每次发布一个exe.其实差不多了,我svn做dailybuild. 天天编译.
看项目管理和部署了,提倡分很多个DLL的 可能不喜欢这个方式. 但是你实际项目不同,就你目前这个例子来说,人家就不给你DLL 另外的路径.

3.或……
[/Quote]

谢谢大头娃娃的指点,你的第3个方法什么时候找机会试试,应该不错。
truelove7283159 2010-08-10
  • 打赏
  • 举报
回复
1.DELPHI提供了,BCB基本上都有(不能说一定有:) ).
2. 你使用DLL 方式是每次程序更新发布一个DLL 就好了.
使用LIBRARY呢,是每次发布一个exe.其实差不多了,我svn做dailybuild. 天天编译.
看项目管理和部署了,提倡分很多个DLL的 可能不喜欢这个方式. 但是你实际项目不同,就你目前这个例子来说,人家就不给你DLL 另外的路径.

3.或者你还是用DLL, 把DLL生成的路径统一指定到项目的bin 下面,整个项目的exe dll都在一个目录下面.
如果说你的主程序是根据条件执行不同路径下同名的DLL,你主程序做个设置好了,记录当前用那个目录的, 要配置到哪个目录的DLL, 一旦发现不一样, 就把bin下这个删除了.把另外一个要配置的DLL复制到BIN下面,然后记录当前使用DLL.


看人家对你的要求,好象意思就是说做绿色软件,目录整个复制过来就能用,不需要配置. 或者说在安全管理就把你限定在一个目录下面. 嘿嘿:)

[Quote=引用 25 楼 jaffy 的回复:]
是呀,那还是存在如果LIB变了,主程序也要跟着编译的问题,
我只是提供一个想法,如果实在不行,我再考虑其他的方法。
因为我记得DELPHI似乎提供external 然后指定路径的方法,不知道BCB提没提供?
[/Quote]
jaffy 2010-08-09
  • 打赏
  • 举报
回复
[Quote=引用 24 楼 truelove7283159 的回复:]
1 不想动态调用DLL
2 不给自己程序的context设置临时环境变量 不能放到system下面去

那干脆在建立这些DLL 时候就不要选DLL了啊, 选哪个LIBRARY啊,
注意 不是选了DLL 在implib 出来的哪个LIB哦. 嘿嘿.
这样死活都要有一个DLL 存在的.

直接选LIBRARY,代码还是分开了,模块化了, 就是LINK时候直接LINK把目标文件给弄大了哈.……
[/Quote]

是呀,那还是存在如果LIB变了,主程序也要跟着编译的问题,
我只是提供一个想法,如果实在不行,我再考虑其他的方法。
因为我记得DELPHI似乎提供external 然后指定路径的方法,不知道BCB提没提供?
truelove7283159 2010-08-07
  • 打赏
  • 举报
回复
1 你在你程序里面取path, set path,这是只是你来用的啊.
跟别人没关系啊, 也没改系统的啊.

2既然是静态用了, 为啥非要是DLL 呢.
你把DLL编译成LIB, 主程序直接LIB好了.
直接生成到目标文件了, 就是目标文件大了点啊.



[Quote=引用 4 楼 jaffy 的回复:]
我就想把DLL放在EXE所在目录的子目录中静态调用,到底有没有办法实现啊?
当然不准修改系统PATH目录
[/Quote]
truelove7283159 2010-08-07
  • 打赏
  • 举报
回复
1 不想动态调用DLL
2 不给自己程序的context设置临时环境变量 不能放到system下面去

那干脆在建立这些DLL 时候就不要选DLL了啊, 选哪个LIBRARY啊,
注意 不是选了DLL 在implib 出来的哪个LIB哦. 嘿嘿.
这样死活都要有一个DLL 存在的.

直接选LIBRARY,代码还是分开了,模块化了, 就是LINK时候直接LINK把目标文件给弄大了哈.
laowang2 2010-08-07
  • 打赏
  • 举报
回复
不知道怎么实现。
jaffy 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 eyao213 的回复:]
引用 8 楼 jaffy 的回复:
我试过了的,还是不行啊!
你的可以不会是DLL放在SYSTEM32下了吧



#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#pragma comment(lib, "C:\Documents and Settings\EMI-TE\桌面\hhh\lib\AddDll.lib")
……
[/Quote]

你看看你的PATH路径中是否加了C:\Documents and Settings\EMI-TE\桌面\hhh\lib\这个路径的啊!
我其实不要固定路径DLL,因为用户可能直接拷贝过去使用,所以希望放在EXE的子级目录下。
希望你再测试,看看能否实现。

ccrun.com 2010-08-06
  • 打赏
  • 举报
回复
lib文件放在什么地方,只在编译期有意义。编译完成后,lib文件就没用了。

楼主的需求,又不允许更改path,实现有难度
明朝2013 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 jaffy 的回复:]
我试过了的,还是不行啊!
你的可以不会是DLL放在SYSTEM32下了吧
[/Quote]


#include <vcl.h>
#pragma hdrstop

#include "Unit1.h"
#pragma comment(lib, "C:\Documents and Settings\EMI-TE\桌面\hhh\lib\AddDll.lib")
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"


TForm1 *Form1;
extern "C" __declspec(dllimport) int __stdcall add(int x,int y);
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------


void __fastcall TForm1::Button1Click(TObject *Sender)
{
Edit1->Text=add(2,3);
}

我用BC6验证的,其他路径没放置调用的lib
jaffy 2010-08-06
  • 打赏
  • 举报
回复
我试过了的,还是不行啊!
你的可以不会是DLL放在SYSTEM32下了吧
明朝2013 2010-08-06
  • 打赏
  • 举报
回复
添加这个..
#pragma comment(lib, "C:\Documents and Settings\EMI-TE\桌面\hhh\lib\AddDll.lib")
jaffy 2010-08-06
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 eyao213 的回复:]
Project->Options打开Dirctories/Conditionals选项Library path新增一个制定路径
[/Quote]
我试过,不行啊!
明朝2013 2010-08-06
  • 打赏
  • 举报
回复
Project->Options打开Dirctories/Conditionals选项Library path新增一个制定路径
jaffy 2010-08-06
  • 打赏
  • 举报
回复
我就想把DLL放在EXE所在目录的子目录中静态调用,到底有没有办法实现啊?
当然不准修改系统PATH目录
jaffy 2010-08-06
  • 打赏
  • 举报
回复
那和放在system32不是差不多吗?
也不允许修改用户和系统的PATH
明朝2013 2010-08-06
  • 打赏
  • 举报
回复
把你的dll用implib生成lib放置在C:\Program Files\Borland\CBuilder6\Lib目录下
加载更多回复(11)

1,221

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧