注册 登录
编程论坛 C++教室

DLL 文件中定义的函数和普通函数有什么区别吗

vfdff 发布于 2008-09-22 17:14, 1028 次点击
我的程序原来使用的都是普通的一些子函数
今天看到了DLL,所以想用一下
就把其中的一些二维空间申请的函数使用了DLL方式提供给程序使用,而保持二维空间释放部分的函数为普通的子函数
结果程序编译没有问题,而运行的时候,在二维空间的释放那里出现了问题

然后我把二维空间释放部分的函数 也已DLL方式提供给程序使用,则编译运行又全都没有问题了!
所以我有个疑问,难道这些普通子函数和DLL定义的子函数一定要配套的吗?


(ps:我在修改的时候,这些子函数具体代码没有改变,只是按照DLL方式修改了他们的返回类型)
7 回复
#2
天使梦魔2008-09-22 22:03
不太明白你说什么

应该看下DLL的原理,DLL是在内存中映射的一部分,是程序都可以使用

这意味着普通的EXE如果不退出(通过DLL的正常释放),是无法注销DLL内部的数据的.
----------------------这是正常使用的情况下
#3
vfdff2008-09-23 00:18
具体的将 就是
原来我声请及释放二维空间的函数
double        **Alloc_Double_Img(short x_size,short y_size);
void Free_Img (void ***image);
都是直接写在一个.cpp文件中
构成一个多文件的工程,一起编译运行正确

现在我把 double        **Alloc_Double_Img(short x_size,short y_size); 函数生成了一个DLL
然后 只保留 void Free_Img (void ***image);在这个 .cpp文件中
可是现在能通过编译,但是运行的时候由问题

再把 double  **Alloc_Double_Img(short x_size,short y_size);和
void Free_Img (void ***image);所在的整个文件用来创建DLL 后
这样程序编译 运行都没有问题了
#4
天使梦魔2008-09-23 08:12
这是什么文件,这么夸张,还有二维函数指针.
函数指针有点特别,咳.....具体的可以看<C++编程思想:卷1>
#5
thanatus2008-09-23 12:06
这个不是函数指针,而是一个返回二级指针的函数~
#6
vfdff2008-09-29 00:17
回复 5# thanatus 的帖子
恩 ,理解正确
但是DLL 文件中定义的函数和普通函数有什么区别吗?
#7
你们都要疼我哦2008-09-29 00:38
我是平行世界的另一端  我们都热爱和平.

DLL定义的函数需要在DLL中有输出表.
EXE中如果需要使用DLL中函数,需要在输入表中提供DLL中输出表部分提供的函数名或序号.
DLL中因为地址不一定固定,所以无法把固定函数地址表示出来.
EXE中还有个IAT输入地址表,EXE文件在被系统装载到内存后,系统会把该EXE中的输入表部分指定需要的DLL也装进内存,同时根据函数名或序号 查找得到内存地址,然后把得到的地址填写到IAT表中,这样EXE就可以使用DLL提供的函数了.      
DLL中函数的地址需要系统去动态填写EXE的IAT表,普通函数不需要.

DLL的代码重定位引起的问题哇,写成DLL以后,运行时装载的基地址变了,所以和释放的那部分不配套. 如果都写成同一个DLL,基地址相同,就没问题了.

楼主的帖子我没看明白 ,  我讲的楼主也未必清楚,  但是,这又有什么关系呢,只要我们都热爱和平就足够了...  愿地球和火星同在. 阿门.

[[it] 本帖最后由 你们都要疼我哦 于 2008-9-29 00:51 编辑 [/it]]
#8
vfdff2008-09-29 16:28
回复 7# 你们都要疼我哦 的帖子
我感觉你的回答对上了
可能真的是由于这个 基地址不相同 引起的
请问 版主 由什么 方法进行验证吗 ??
1