怎么将动态库需要读取的文件封到动态库中去

starytx 2011-05-19 11:15:18
MFC扩展动态库,需要用到几个文件(用记事本打开,可以看到明文的),也就是读取一遍里边的内容,现在想把这几个文件封装到DLL中,否则使用这个DLL时还得附带那几个文件,不知道怎么做?
...全文
141 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
starytx 2011-05-20
  • 打赏
  • 举报
回复
我刚才DllMain传了一个类中的函数名,发现编译老是不通过,换成一个全局函数名,OK了。结果页正确,多谢耐心的答复,加分是必须的。[Quote=引用 18 楼 lactoferrin 的回复:]
你可以在任何时候使用这个来得到模块句柄
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(DllMain,&mbi,sizeof mbi);
mbi.AllocationBase就是模块句柄
这里的DllMain可以换成dll中任意一个函数地址或者全局变量的地址
[/Quote]
cngst 2011-05-19
  • 打赏
  • 举报
回复
加到RES(资源文件中)
starytx 2011-05-19
  • 打赏
  • 举报
回复
我加载到资源后添加的资源类型是“LIB”,以前打开文件是fopen("文件名","");现在怎么用呢?
King_hhuang 2011-05-19
  • 打赏
  • 举报
回复
把文件加到资源中啊
就像你程序中用到的图片资源一样
碧螺春的马甲 2011-05-19
  • 打赏
  • 举报
回复
在 res 段里面添加 binary 资源。
CodeProject-Jerry 2011-05-19
  • 打赏
  • 举报
回复
把这几个文件嵌入到dll的资源里面

在运行时使用API读取
Lactoferrin 2011-05-19
  • 打赏
  • 举报
回复
你可以在任何时候使用这个来得到模块句柄
MEMORY_BASIC_INFORMATION mbi;
VirtualQuery(DllMain,&mbi,sizeof mbi);
mbi.AllocationBase就是模块句柄
这里的DllMain可以换成dll中任意一个函数地址或者全局变量的地址
Lactoferrin 2011-05-19
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 starytx 的回复:]

好像==1时只执行一次,但现在我是在一个类的构造中FindResource的,而这个类的对象是一个全局变量,时间比这儿早,怎么办呢引用 14 楼 lactoferrin 的回复:
DllMain会被多次执行
但fdwReason==1时只会有一次,而且是dll被加载时首先执行的
[/Quote]
你的DllMain是crt调用的,并不是真正的入口点,因此不是最先被调用
你可以规定DllMain为入口点,但这样全局对象就不会自动调用构造函数
buyong 2011-05-19
  • 打赏
  • 举报
回复
我记得好像用dll中的资源,应该先AfxSetResourceHandle
用完在设置为exe的handle

AfxSetResourceHandle
void AfxSetResourceHandle( HINSTANCE hInstResource );

Parameters

hInstResource

The instance or module handle to an .EXE or DLL file from which the application’s resources are loaded.

Remarks

Use this function to set the HINSTANCE handle that determines where the default resources of the application are loaded.


[Quote=引用 8 楼 starytx 的回复:]
嗯,我在一个exe中进行了测试,已经弄好了,但在DLL中同样的方法为什么FindResource返回NULL了

引用 7 楼 lactoferrin 的回复:
加载到了资源后用FindResource+LoadResource即可得到数据的地址
LockResource是为了兼容老程序而保留的,可不使用
[/Quote]
starytx 2011-05-19
  • 打赏
  • 举报
回复
好像==1时只执行一次,但现在我是在一个类的构造中FindResource的,而这个类的对象是一个全局变量,时间比这儿早,怎么办呢[Quote=引用 14 楼 lactoferrin 的回复:]
DllMain会被多次执行
但fdwReason==1时只会有一次,而且是dll被加载时首先执行的
[/Quote]
Lactoferrin 2011-05-19
  • 打赏
  • 举报
回复
DllMain会被多次执行
但fdwReason==1时只会有一次,而且是dll被加载时首先执行的
starytx 2011-05-19
  • 打赏
  • 举报
回复
我定义了一个全局的HMODULE这样试过了,我发现这儿这个赋值没有我FindResource那儿运行的早,而且这儿运行了9次[Quote=引用 12 楼 lactoferrin 的回复:]
static HMODULE BaseAddress;

BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
)
{
if(fdwReason==1)BaseAddress=hinstDLL;
return 1;
}

后面用的时候模块句柄就传BaseAddre……
[/Quote]
Lactoferrin 2011-05-19
  • 打赏
  • 举报
回复
static HMODULE BaseAddress;

BOOL WINAPI DllMain(
HINSTANCE hinstDLL,
DWORD fdwReason,
LPVOID lpvReserved
)
{
if(fdwReason==1)BaseAddress=hinstDLL;
return 1;
}

后面用的时候模块句柄就传BaseAddress
starytx 2011-05-19
  • 打赏
  • 举报
回复
动态库中导入的文件,那FindResource的第一个参数是不是不能填NULL了?那应该填什么[Quote=引用 9 楼 cngst 的回复:]
引用 8 楼 starytx 的回复:

嗯,我在一个exe中进行了测试,已经弄好了,但在DLL中同样的方法为什么FindResource返回NULL了引用 7 楼 lactoferrin 的回复:
加载到了资源后用FindResource+LoadResource即可得到数据的地址
LockResource是为了兼容老程序而保留的,可不使用


检查一下是不是模块句柄弄错了
[/Quote]
Lactoferrin 2011-05-19
  • 打赏
  • 举报
回复
dll中模块句柄不能传0,要传DllMain中得到的模块句柄
cngst 2011-05-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 starytx 的回复:]

嗯,我在一个exe中进行了测试,已经弄好了,但在DLL中同样的方法为什么FindResource返回NULL了引用 7 楼 lactoferrin 的回复:
加载到了资源后用FindResource+LoadResource即可得到数据的地址
LockResource是为了兼容老程序而保留的,可不使用
[/Quote]

检查一下是不是模块句柄弄错了
starytx 2011-05-19
  • 打赏
  • 举报
回复
嗯,我在一个exe中进行了测试,已经弄好了,但在DLL中同样的方法为什么FindResource返回NULL了[Quote=引用 7 楼 lactoferrin 的回复:]
加载到了资源后用FindResource+LoadResource即可得到数据的地址
LockResource是为了兼容老程序而保留的,可不使用
[/Quote]
Lactoferrin 2011-05-19
  • 打赏
  • 举报
回复
加载到了资源后用FindResource+LoadResource即可得到数据的地址
LockResource是为了兼容老程序而保留的,可不使用
HonYon 2011-05-19
  • 打赏
  • 举报
回复
既然不需要动态加载,为什么不把文件内容直接写死在代码里呢,呵呵

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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