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")
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);
比较简单,类似于在别的源文件中写了一些相关函数,调用其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);
- dll
- DLL
- dll
- DLL
- DLL
- DLL
- Dll
- DLL
- DLL
- DLL
- DLL
- dll
- dll
- dll
- Dll
- DLL
- dll
- DLL
- 感谢CSDN送我的包包....
- public同义词和表名相同时orcle访问机制
- android 多点触控
- Linux下获取线程TID的方法——gettid()
- CyAPI应用程序BULK传输模块
- dll
- archlinux上安装QEMU+EFI BIOS
- 比伯女友首谈私生子事件 挺男友:事实胜于诡辩
- linux 查找上一个命令 set -o vi
- 【php】PHP缓冲剖析
- 平常心谈软件设计模式(一)
- Windows socket之WSAEventSelect模型
- makefile变量
- 关于android中MotionEvent认识