| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1028 人关注过本帖
标题:DLL 文件中定义的函数和普通函数有什么区别吗
只看楼主 加入收藏
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
结帖率:79.17%
收藏
 问题点数:0 回复次数:7 
DLL 文件中定义的函数和普通函数有什么区别吗
我的程序原来使用的都是普通的一些子函数
今天看到了DLL,所以想用一下
就把其中的一些二维空间申请的函数使用了DLL方式提供给程序使用,而保持二维空间释放部分的函数为普通的子函数
结果程序编译没有问题,而运行的时候,在二维空间的释放那里出现了问题

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


(ps:我在修改的时候,这些子函数具体代码没有改变,只是按照DLL方式修改了他们的返回类型)
搜索更多相关主题的帖子: 函数 DLL 定义 文件 
2008-09-22 17:14
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
不太明白你说什么

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

这意味着普通的EXE如果不退出(通过DLL的正常释放),是无法注销DLL内部的数据的.
----------------------这是正常使用的情况下
2008-09-22 22:03
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
具体的将 就是
原来我声请及释放二维空间的函数
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 后
这样程序编译 运行都没有问题了
2008-09-23 00:18
天使梦魔
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:37
帖 子:564
专家分:2754
注 册:2007-8-29
收藏
得分:0 
这是什么文件,这么夸张,还有二维函数指针.
函数指针有点特别,咳.....具体的可以看<C++编程思想:卷1>
2008-09-23 08:12
thanatus
Rank: 1
等 级:新手上路
帖 子:27
专家分:0
注 册:2006-8-16
收藏
得分:0 
这个不是函数指针,而是一个返回二级指针的函数~
2008-09-23 12:06
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 5# thanatus 的帖子
恩 ,理解正确
但是DLL 文件中定义的函数和普通函数有什么区别吗?
2008-09-29 00:17
你们都要疼我哦
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:火星
等 级:贵宾
威 望:49
帖 子:1296
专家分:2746
注 册:2008-7-13
收藏
得分:0 
我是平行世界的另一端  我们都热爱和平.

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]]

小妹,哥哥看你骨骼清奇,绝非凡人,将来必成大业,不如这样,你先把裤裤脱了,待哥哥为你开启灵窍,然后我们一起努力钻研如何
2008-09-29 00:38
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
收藏
得分:0 
回复 7# 你们都要疼我哦 的帖子
我感觉你的回答对上了
可能真的是由于这个 基地址不相同 引起的
请问 版主 由什么 方法进行验证吗 ??
2008-09-29 16:28
快速回复:DLL 文件中定义的函数和普通函数有什么区别吗
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.026246 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved