zoukankan      html  css  js  c++  java
  • MFC创建动态链接库DLL并调用方法详解

    实例一:

    1、创建一个动态链接库工程,如login_dll。

    2、在原工程头文件或者新建头文件如showdlg.h定义动态链接库的导出函数,代码如下:

    #include "stdafx.h"
    #define EXPORT __declspec(dllexport)
    extern "C"  EXPORT  void __stdcall  Showdialg(char* pText);

    3、在动态链接库源文件中定义showdialog函数,代码如下:

    void _stdcall Showdialg(char* pText)
    {
      MessageBox(NULL,pText,"提示一",0);
     }

    注:此步编译后,即可生成dll与lib文件,因为_stdcall是一种比较流行的函数调用约定,(或者可以不用_stdcall),如果使用的时候,为了防止发生函数命令改编的情况,可以定义一个.def文件,其中加入EXPORTS节,设置导出函数名,如下所示:

    LIBRARY      "login_dll"

    EXPORTS
       Showdialg = Showdialg

    4、创建一个基于对话框的工程。

    5、定义一个函数指针类型,其定义与动态链接库的函数原型相同,代码如下:

    typedef void  (__stdcall * funShowInfo)(char* pchData);

    6、处理按键单击事件,加载动态链接库,代码如下:

    void Cuse_login_dllDlg::OnBnClickedOk(){

    HMODULE hMod = LoadLibrary("login_dll.dll");
     if (hMod != NULL)
     {
     funShowInfo ShowInfo;
    ShowInfo = (funShowInfo)GetProcAddress(hMod,"Showdialg");
     if (ShowInfo)
     ShowInfo("传入参数成功且调用正常");
     }
     FreeLibrary(hMod);

    其中,第5步与第6步是通过LoadLibrary函数动态加载链接库的方法,下面介绍一下静态加载链接库的方法:

    1、加载链接库的头文件,将动态链接库头文件拷贝到当前工程中,并在当前工程头文件进行声明。

    2、加载动态链接库文件,将动态链接库文件dll拷贝至当前工程目录下。

    3、加载lib文件,#pragma comment (lib,"login_dll.lib")

    4、处理按钮单击事件,调用动态链接库中的方法。

    void Cuse_login_dllDlg::OnBnClickedOk(){

    showdialog("传入参数成功且调用正常");

    备注:用上述静态加载动态链接库不需要使用第五步中的typedef void  (__stdcall * funShowInfo)(char* pchData)来定义一个函数指针类型。

    实例二:(实例二与实例一一样,仅供参考)

    1、第一步创建一“MFC AppWizard (dll)”工程,接下来选择“Regular Dll using shared MFC DLL”,点击“Finish”。

    2、添加一对话框资源到工程中,从菜单中选择Insert->Resource,添加一“Dialog”

    选择“New”,至此对话框已添加到DLL工程中。

    3、为对话框添加一新类,如:CTest,基类为CDialog。

    4、在MFCDLL.cpp中(因创建的工程为MFCDLL)添加接口函数:

    extern "C" __declspec(dllexport) void Show()
    {
      AFX_MANAGE_STATE(AfxGetStaticModuleState());
      CTest test;
      test.DoModal ();
    }

    别忘了在文件中添加: #include "Test.h":),大功告成,编译吧! 

    5、用VC新建一对话框工程,在一按钮点击事件中添加如下代码:

    typedef void (WINAPI * TESTDLL)();
    HINSTANCE hmod;
    hmod = ::LoadLibrary ("mfcdll.dll");
    if(hmod==NULL)
    {
      AfxMessageBox("Fail");
    }
    TESTDLL lpproc;
    lpproc = (TESTDLL)GetProcAddress (hmod,"Show");
    if(lpproc!=(TESTDLL)NULL)
      (*lpproc)();
    FreeLibrary(hmod);

    6、试试看,是不是DLL中对话框显示出来了:)

  • 相关阅读:
    如何在IDEA中查看Gradle项目的所有依赖关系
    YUYV&YV12&mtk6763
    MTK-shot mode
    Thread中,join()方法
    高通平台常用缩写
    Android.mk用法详解
    HAL层编写规范
    MMU
    Linux设备驱动中断机制
    阻塞和非阻塞I/O
  • 原文地址:https://www.cnblogs.com/jinjiangongzuoshi/p/3295638.html
Copyright © 2011-2022 走看看