zoukankan      html  css  js  c++  java
  • Windows Api学习笔记动态连接库(DLL)的使用

    #include <windows.h>
    #include <iostream>
    #include "12dll.h"
    using namespace std;
    
    #pragma comment(lib,"12Dll")//要链接到什么库文件
    
    void main()
    {
    	//CMy12Dll a;
    	cout<<fnMy12Dll()<<endl;
    	char b;
    	cin>>b;
    }
    
    

    VS2008

    新建WIN32项目

    选择动态连接库

    应用程序类型为:WINDOWS 应用程序

    附加选项为:导出符号

    dllmain.cpp中有动态连接库的入口函数

    BOOL APIENTRY DllMain(HANDLE hModule,//DLL模块句柄
    					  DWORD ul_reason_for_all,//调试原因
    					  LPVOID lpReserved//没有使用
    					  )
    {
    	switch(ul_reason_for_all)
    	{
    	case DLL_PROCESS_ATTACH://动态链接库刚被映射到某个进程的地址空间
    		g_hModule = (HMODULE)hModule;
    		break;
    	case DLL_PROCESS_DETACH://动态链接库将被卸载
    		break;
    	}
    	return TRUE;
    }
    

    动态连接库的主要逻辑函数如下:

    #include "stdafx.h"
    #include "12Dll.h"
    
    // 这是导出变量的一个示例
    MY12DLL_API int nMy12Dll=12345;
    
    // 这是导出函数的一个示例。
    MY12DLL_API int fnMy12Dll(void)
    {
    	return 67890;
    }
    
    // 这是已导出类的构造函数。
    // 有关类定义的信息,请参阅 12Dll.h
    CMy12Dll::CMy12Dll()
    {
    	return;
    }
    

    动态链接库的逻辑函数是通过如下代码在头文件中公开给外部的

    // 下列 ifdef 块是创建使从 DLL 导出更简单的
    // 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 MY12DLL_EXPORTS
    // 符号编译的。在使用此 DLL 的
    // 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
    // MY12DLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
    // 符号视为是被导出的。
    #ifdef MY12DLL_EXPORTS
    #define MY12DLL_API __declspec(dllexport)
    #else
    #define MY12DLL_API __declspec(dllimport)
    #endif
    
    // 此类是从 12Dll.dll 导出的
    class MY12DLL_API CMy12Dll {
    public:
    	CMy12Dll(void);
    	// TODO: 在此添加您的方法。
    };
    
    extern MY12DLL_API int nMy12Dll;
    
    MY12DLL_API int fnMy12Dll(void);
    

    如何使用刚刚创建的DLL

    有两种办法

    一:

    把DLL,LIB,和声明导出函数的头文件一起复制到工程文件的主目录下

    然后引入头文件

    然后就可以想使用自己的函数一样使用动态连接库中的函数了

    代码如下 

    #include <windows.h>
    #include <iostream>
    #include "12dll.h"
    using namespace std;
    
    #pragma comment(lib,"12Dll")//要链接到什么库文件
    
    void main()
    {
    	//CMy12Dll a;
    	cout<<fnMy12Dll()<<endl;
    	char b;
    	cin>>b;
    }
    

    二:

    在DLL工程中加入一个def文件

    名字可以随便起

    内容如下:

    LIBRARY	"12Dll"
    EXPORTS
      fnMy12Dll
    

    重新生成DLL工程

    重新开被到目标工程

    目标工程代买改为如下

    #include <windows.h>
    #include <iostream>
    using namespace std;
    
    typedef int (*my_dll_func)(void);//预定义函数的名字
    
    void main()
    {
    	HMODULE hModule = ::LoadLibrary("F:\\test\\10test\\10test\\12Dll.dll");
    	if(hModule != NULL)
    	{
    		my_dll_func mf = (my_dll_func)::GetProcAddress(hModule,"fnMy12Dll");
    		if(mf != NULL)
    		{
    			cout<<mf()<<endl;
    		}		
    	}
    	char b;
    	cin>>b;
    }
    
    

    运行就看到答案了

  • 相关阅读:
    h5-news_index
    h5-爆料view
    h5-列表
    h5-注册
    h5-登录
    h5-弹出层layer,提示,顶部横条,
    jquery 弹窗插件 layer
    jQuery幻灯片插件Owl Carousel
    display:block jquery.sort()
    Android 开源框架ViewPageIndicator 和 ViewPager 仿网易新闻客户端Tab标签
  • 原文地址:https://www.cnblogs.com/liulun/p/1665498.html
Copyright © 2011-2022 走看看