zoukankan      html  css  js  c++  java
  • 动态库DLL中类的使用

    一、DLL中类的导出

    在类名称前添加 _declspec(dllexport)定义,比如:

    class _declspec(dllexport) CMath{

    ....

    };


    通常使用预编译开关切换类的导入导出定义,比如:

    #ifdef DLLCLASS_EXPORTS

    #define EXT_CLASS _declspec(dllexport) //DLL

    #else

    #define EXT_CLASS _declspec(dllimport) //使用者

    #endif


    class EXT_CLASS CMath{

    ...........

    };


    二、使用DLL中的类

    1、导入DLL的lib

    2、类的定义

    3、使用类


    样例代码例如以下:

    DLL类源代码

    .h文件

    #ifndef _DLL_CLASS_
    #define _DLL_CLASS_
    
    //定义导入。导出宏开关.
    #ifdef DLLCLASS_EXPORT
    #define EXT_CLASS _declspec(dllexport)
    #else
    #define EXT_CLASS _declspec(dllimport)
    #endif
    
    class EXT_CLASS CMath
    {
    public:
    	int Add(int num1,int num2);
    	int Sub(int num1,int num2);
    };
    
    
    #endif

    .cpp文件

    #define DLLCLASS_EXPORT
    
    #include "DllClass.h"
    #include <WINDOWS.H>
    #include <CSTDIO>
    
    BOOL CALLBACK DllMain(HINSTANCE hInst,DWORD fDwReason,VOID* Reserve)
    {
    	switch(fDwReason)
    	{
    	case DLL_PROCESS_ATTACH:
    		{
    			//初始化工作.
    			printf(__TEXT("DllClass is loading.
    "));
    		}
    		break;
    	case DLL_PROCESS_DETACH:
    		{
    			//善后处理工作.
    			printf(__TEXT("DllClass is unloading.
    "));
    		}
    		break;
    	case DLL_THREAD_ATTACH:
    		{
    
    		}
    		break;
    	case DLL_THREAD_DETACH:
    		{
    
    		}
    		break;
    	}
    
    	return 1;
    }
    
    int CMath::Add(int num1,int num2)
    {
    	return num1+num2;
    }
    
    int CMath::Sub(int num1,int num2)
    {
    	return num1-num2;
    }



    们看到上面的DLL类中包括了DllMain(...)函数,这个函数为DLL动态库的程序入口。

    入口程序不是DLL必须的,经常使用于DLL内部初始化或善后处理。

    BOOL WINAPI DllMain(

    HINSTANCE hinstDLL, //动态库实例句柄

    DWORD fdwReason, //初调用原因

    LPVOID  lpvReserved //保留值

    ); 返回TRUE,表示动态库载入成功。

    DllMain(.... ) 动态库的载入或卸载时会被调用。

    比如:使用LoadLibrary或FreeLibrary时会被调用。

    fdwReason取值例如以下:

    #define DLL_PROCESS_ATTACH 1 //进程载入    
    #define DLL_THREAD_ATTACH   2  
     //线程载入 
    #define DLL_THREAD_DETACH   3  
    //线程卸载 
    #define DLL_PROCESS_DETACH 0  
    //进程卸载


  • 相关阅读:
    11
    消除左递归
    4.K均值算法--应用
    3.K均值算法
    2.机器学习相关数学基础作业
    机器算法学习第一次作业
    第十五次作业
    第十四次作业
    第十三次作业
    第十二次作业
  • 原文地址:https://www.cnblogs.com/brucemengbm/p/7399737.html
Copyright © 2011-2022 走看看