静态库和动态库

来源:互联网 发布:海伦凯勒商城源码 编辑:程序博客网 时间:2024/06/08 09:44

1.关于windows下DLL存放位置:
http://blog.sina.com.cn/s/blog_4fe8580b0100suyj.html
1.1 32位系统下存放DLL的位置是:%windir%\system32
1. 64位系统:SYSWOW64文件夹存放了32位的DLL库,但是在64位系统测试DLL的查找路径时候,可能会得到DLL的文件夹位置还是system32(这里面是系统做了某种重定向)
2. 64位系统的64位DLL文件存放的文件夹是system32

void outputDllPathchar szBuf[MAXBYTE] = 0;DWORD dwRet = GetModuleFileName(NULL, szBuf, MAXBYTE);OutputDebugString(szBuf);

3.类的动态调用
类本身不导出
只导出一个创建和销毁对象 函数

CMyString* createObject(){    return new CMyString();}
CMyString* pString = CreateObject();pString ->虚函数();

4.DLL里面导出全局变量g_Val
系统通过分页管理内存资源,按页给相应程序映射DLL,物理内存只有一份拷贝,达到解决内存冗余的问题。
全局变量采用写时拷贝技术,隔离两个独立的exe的数据
当然也可以关闭写时拷贝功能,达到两个独立的exe共用同一个全局变量数据

私有导出
LIB中没有函数信息,无法隐式调用,但是可以显示调用

隐式调用的代码生成:
已知函数名+DLL名,不知道函数实现地址
在exe中的函数名那个地方写一个表地址,这个表在内存的某个位置,这个表存放的是外部函数的如DLL的模块地址及函数的偏移地址(加载DLL+查找函数实现位置)

//函数转发#pragma command(linker,"/exports:mySub = EXP.mySub")告诉编译器查找mySub函数到EXP.dll里面去找。

WinMain()窗口处理函数
dllmain()给操作系统在恰当时机去调用的。

DLL调试:F,指定加载的程序

系统(第一次)给exe创建DLL内存映射这一动作的时候,DLL_PROCESS_Attach消息会来

0 0