• 生成DLL的几种方法和使用方法


    1.用__declspec (dllexport) 约定来导出DLL函数
    建立一个EDRLIB动态连接库项目:
    /*EDRLIB.h文件*/
    #ifdef __cplusplus
    #define EXPORT extern "C" __declspec (dllexport)   //如是 C++编译则用extern"C"限制其为C模式编译
    #else
    #define EXPORT __declspec (dllexport)
    #endif
    EXPORT BOOL CALLBACK EdrCenterText (HDC, PRECT, PCSTR) ;
    EXPORT BOOL CALLBACK MsgBox (PCSTR);

    /*EDRLIB.C文件*/

    #include <windows.h>
    #include "edrlib.h"
    int WINAPI DllMain (HINSTANCE hInstance, DWORD fdwReason, PVOID pvReserved)

    {
    switch(fdwReason)
    {
    case DLL_PROCESS_ATTACH://DLL被加载
    MessageBox(0,"DLL正被加载 !","DllMessage",0);
    break;
    case DLL_PROCESS_DETACH:
    MessageBox(0,"进程将要退出!","DllMessage",0);
    break;
    default:
    break;
    }
    return TRUE ;
    }
    EXPORT BOOL CALLBACK EdrCenterText(HDC hdc, PRECT prc, PCSTR pString)
    {
    int iLength ;

    SIZE size ;
    char cstr[20];
    iLength = lstrlenA (pString) ;
    GetTextExtentPoint32A (hdc, pString, iLength, &size) ;
    return TextOutA (hdc,(prc->right - prc->left - size.cx) / 2,
    ( prc->bottom - prc->top - size.cy) / 2,
    pString, iLength) ;

    }
    EXPORT BOOL CALLBACK MsgBox (PCSTR pString)
    {
    MessageBox(0,pString,"DllMessage",0);
    return TRUE;

    }
    这样就生成了一个EDRLIB.lib,EDRLIB.dll
    在项目中使用:
    1.1通过EDRLIB.lib引用连接库来使用
         EDRLIB.lib放置到settings->Link->Input->Object/libary modules中,并设置Additional library Path路径正确.
    代码如下 :
    /*test.c文件*/
    #include "stdafx.h"
    #include "../edrlib/EDRLIB.h"   //引用头文件
    /*省略一些代码*/
    EdrCenterTextA (hdc, &rect,TEXT ("调用DLL接口输出信息")) ;//可以直接使用该函数
    /*省略一些代码*/

    1.2通过LoadLibrary来动态加载,但这里请用DLL函数查看器,看清楚DLl对外提供的函数接口名.
    /*test.c文件*/
    #include "stdafx.h"
    #include "resource.h"
    typedef BOOL (__stdcall* EdrCenterTextA)(HDC,PRECT,PCSTR); //定义数据类型
    typedef BOOL (__stdcall* MsgBox)(PCSTR);
    /*省略一些代码*/
    HMODULE hDllLib = LoadLibrary("EDRLIB.dll");//加载成功
    EdrCenterTextA EdrCenterText2 = (EdrCenterTextA)GetProcAddress(hDllLib,"_EdrCenterText@12");
    EdrCenterText2(hdc, &rect,"hello") ;
    FreeLibrary(hDllLib);
    /*省略一些代码*/

    2.用*.def文件导出Dll函数
    *.def文件说明:http://msdn.microsoft.com/zh-cn/library/28d6s79h(VS.80).aspx

    /*EDRLIB.h文件*/
    #ifdef __cplusplus
    #define EXPORT extern "C"    //如是 C++编译则用extern"C"限制其为C模式编译
    #else
    #define EXPORT
    #endif
    EXPORT BOOL EdrCenterText (HDC, PRECT, PCSTR) ;
    EXPORT BOOL MsgBox (LPCTSTR);

    /*EDRLIB.def文件*/
    LIBRARY         EDRLIB.dll
    DESCRIPTION     '(c)2008-2009 yan'
    version '1.0.0.1'
    EXPORTS
    MsgBox @1 PRIVATE
    EdrCenterText @2 PRIVATE

    我们可以通过1.1的方法来使用,但是要把EDRLIB.def文件引用到Test使用项目中去,Project->SETTINGS->lINK ->Projcet Options    加入/DEF:EDRLIB.def

    ]深入浅出Visual C++动态链接库(Dll)编程:http://langzi0115.bokee.com/6508109.html

  • 相关阅读:
    [CareerCup] 11.6 Search a 2D Matrix 搜索一个二维矩阵
    [CareerCup] 11.5 Search Array with Empty Strings 搜索含有空字符串的数组
    [CareerCup] 11.4 Sort the File 文件排序
    [CareerCup] 11.3 Search in Rotated Sorted Array 在旋转有序矩阵中搜索
    VTK 6.3.0 Qt 5.4 MinGW 4.9.1 Configuration 配置
    [CareerCup] 11.2 Sort Anagrams Array 异位词数组排序
    [CareerCup] 11.1 Merge Arrays 合并数组
    Matlab Delete Row or Col 删除矩阵的行或列
    [CareerCup] 10.7 Simplified Search Engine 简单的搜索引擎
    [LeetCode] Nim Game 尼姆游戏
  • 原文地址:https://www.cnblogs.com/chenbg2001/p/1383126.html
Copyright © 2020-2023  润新知