dll

来源:互联网 发布:centos开启22号端口 编辑:程序博客网 时间:2024/06/05 13:23
静态库(Win32 Static Library)
比较简单,类似于在别的源文件中写了一些相关函数,调用其lib时候,声明一下原型,就可以使用了
int add(int x,int y)
{
return x+y;
}
像这样
#pragma comment(lib,".\\lib\\Debug\\lib.lib")

extern int add(int ,int );

DllMain函数
BOOL APIENTRY DllMain(HANDLE hModule, DWORD dw, LPVOID lpReserved)
{
switch(dw)
{
case DLL_PROCESS_ATTACH:
printf("DLL_PROCESS_ATTACH\n");
break;
case DLL_THREAD_ATTACH:
printf("DLL_THREAD_ATTACH\n");
break;
case DLL_THREAD_DETACH:
printf("DLL_THREAD_DETACH\n");
break;
case DLL_PROCESS_DETACH:
printf("DLL_PROCESS_DETACH\n");
break;
}
return TRUE;
}
函数如果return FALSE,直接退出


1.导出函数
供外部调用的函数需要导出

2.如果导出全局变量
变量名 CONSTANT
变量名  DATA

如果在dll里面声明了一个int nVal= 10;
要用到dll里面全局变量,可以这样
静态引用lib
extern int nVal//这里的nVal实际是dll里nVal里面的地址
printf("%d "*(int*)nVal);//输出10

一种比较有效的方法是
extern __declspec(dllimport) int nVal;//这里声明

动态的引用可以这样其实质是获得其变量地址,然后引用
int nVal=0;
nVal = (long)GetProcAddress(hIns,"nVal");
printf("%d\n",*(int *)nVal);

3.导出类
1.静态调用比较简单,类似于普通函数,dll文件中要声明导出类
类似这样
class __declspec(dllexport) CTest
....
调用的时候声明类的头文件就可以直接引用了
2.动态调用
可以这样做,在dll里面声明一个接口,返回类指针
void Interface(void **pobj)//这个为接口
{
*pobj = new CTest;
}
//调用的时候...
CTest *p;
........
typedef void(*pfn)(void **);
pfn fun = (pfn)GetProcAddress(hIns,"Interface");
fun((void**)&p);
p->SetData(20);
int a = p->GetData();
printf("%d\n",a);

2.Regular DLL MFC
先说下静态的规则DLL,资源问题.由于是静态直接连接到程序里面,所不资源不需要切换,

动态的规则DLL,资源问题时需要切换
应用程序进程及其调用的每个dll都有一局的HINSTANCE句柄,这代表了每个模块在进程虚拟空间中的超始地址,进程本身的模块句柄一般为0x00400000,dll模块的句柄我测试为0x00f10000
如果同时加载了多个DLL,每个dll模块都会有不同的hinstance,应用程序在加载DLL时对其进行了重定位
EXE,和dll都有自己的资源,而且这些资源的ID有可能重复,如果应用程序需要DLL里面的次源.这时就应该进行资源模块切换

实现方法分两种方式
1.在接口函数里面实现切换
2.在调用的时候实现切换

方法1.
AFX_MANAGE_STATE(AfxGetStaticModuleState());

方法2.

HINSTANCE hExe = AfxGetResourceHandle();
AfxSetResourceHandle(theApp.m_hInstance);
CMyDlg dlg;
dlg.DoModal();
AfxSetResourceHandle(hExe);

方法3.
在应用程序这边调用
HINSTANCE hExe = AfxGetResourceHandle();
pfn fun =(pfn)(GetProcAddress(hIns,"ShowDlg"));
AfxSetResourceHandle(hIns);
fun();
AfxSetResourceHandle(hExe);
原创粉丝点击