标题:请教 关于动态链接库的问题
只看楼主
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
回复 10楼 有容就大
对啊,不要忘了主程序里导入dll头文件。

我们都在路上。。。。。
2012-05-18 13:41
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
再说一下DLL动态链结库是如何改变我们的C编程方式:
这其实也是利用了导出函数表的这个规则,除非导出函数能够被外部调用外,未导出的函数不会被外部调用者看到(识别)。
这意味着导出函数都是接口函数。。内部的实现被隐藏起来了。
比如说:如果一个接口函数的实现,里面有很多的子函数调用,这些子函数如没有必要,就不必提供给外界知道。
所以实现了另一种接口隐藏方式,这让我们程序设计者有了一种全新的编程思考方式。

我们都在路上。。。。。
2012-05-18 13:51
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
理了一遍 你看下哪里不对



Test.cpp


程序代码:
#include <stdio.h>
#include "DllName.H"
#pragma comment(lib, "DLLNAME.lib")

int main(void)
{
    int i = getAge();
    printf("i = %d", i);
    return 0;
}

--
DllName.h
int getAge(void);

void getIntArr(int *a,int len);

---
DllName.cpp
程序代码:
#ifdef EXPORT
    #define DLL   _declspec(dllexport)
#else
    #define DLL  _declspec(dllimport)
#endif


int _stdcall getAge(void)
{
    return 318;
}

void _stdcall getIntArr(int *a,int len)
{
      int i;
      for(i = 0;i<=len;i++)
      {
              *a = i;
      }
}

--

连接DllName  后没发现产生lib文件 有DLL 和 OBJ 文件

COPY 到 TestDll 的Debug 下


然后运行TestDll工程 出现这个


去找哪里找EXE文件路径?

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:00
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
其二,静态链结库(.lib)和动态链结库的不同之处是:静态链结库会将所有的代码链结进目标EXE中,这样会照成
磁盘空间上的浪费,多个EXE中存在着相同的重复代码,而DLL中的代码是可以被多个程序共享,但目标代码只在内存中
存在一份,DLL的代码空间和宿主EXE共享同一段代码空间。

所以不论是windows还是linux中,都会有动态链结库这样的概念存在。

留一个思考给你:你认为VC系统里的提供的.lib是属于静态链结库?还是Dll的导入库?

我们都在路上。。。。。
2012-05-18 14:01
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
回复 14楼 hellovfp
应该算是导入库吧 如果是静态的那么多大的程序就太臃肿了。

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:06
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
不对,
#ifdef EXPORT
    #define DLL   __declspec(dllexport)
#else
    #define DLL  __declspec(dllexport) //注意是双下划线。。
#endif

这段放在Dll的头文件中。
EXPORT是宏,你可以在DLL子工程属性中c/c++那里修改 /D "工程名_EXPORTS",改成 /D "EXPORT"
或是把#ifdef EXPORT 改成 #ifdef 工程名_EXPORTS,这个宏在创建DLL工程的时候,MS会自动命名这个宏名的。

我们都在路上。。。。。
2012-05-18 14:10
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
回复 15楼 有容就大
理解正确,分清这个还是很重要的,我们最终调用的Win32 API都是DLL中的接口就是这个道理。

我们都在路上。。。。。
2012-05-18 14:13
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
头文件里可以这样声明:

DLL int getAge(void);
DLL void getIntArr(int *a,int len);

或是
int DLL getAge(void);
void DLL getIntArr(int *a, int len);

位置没有关系的。

我们都在路上。。。。。
2012-05-18 14:16
hellovfp
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:禁止访问
威 望:30
帖 子:2976
专家分:7697
注 册:2009-7-21
得分:0 
关于如何查看一个DLL中有哪些函数,你可以使用VC自带的工具:在common\tools下面有一个叫Depends.exe,打开它,把DLL拖进去就可以看到了。
如果发现哪个EXE少DLL而不能运行,也可以用这个工具,把exe扔进去,会自动帮你找到需要哪个DLL文件,以红色显示缺少的DLL。

另一个命令行工具是dump.exe,你可以自己查一下如何用。

[ 本帖最后由 hellovfp 于 2012-5-18 14:22 编辑 ]

我们都在路上。。。。。
2012-05-18 14:18
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
得分:0 
把你说的那些都改了后 先提升DllName.h 无法直接打开 我就把DllName里的 .h文件复制到 TestDll下 编译后又提示

cannot open file "\开发语言\练习程序\C语言Two\HAHA\DllName\Debug\DllName.lib"
Error executing link.exe.

我也没发现有lib文件产生呢?把这句注释掉 //#pragma comment(lib, "DLLNAME.lib") 一样提升那个错误?

梅尚程荀
马谭杨奚







                                                       
2012-05-18 14:24



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-367685-1-1.html




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

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