第一个Dll

简单的Dll

#include "stdafx.h"

//导出函数
extern  "C" __declspec(dllexport) VOID MsgBox(char *szMsg);

VOID MsgBox(char *szMsg)  
{  
    char szModuleName[MAX_PATH] = {0};  
    //获取当前进程已加载模块的文件的完整路径,该模块必须由当前进程加载
    GetModuleFileName(NULL,szModuleName,MAX_PATH);  
    MessageBox(NULL,szMsg,szModuleName,MB_OK);  
} 

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch(ul_reason_for_call)  //DllMain被调用的原因
    {
    case DLL_PROCESS_ATTACH:  //当DLL被某进程加载时被调用
        MsgBox("DLL_PROCESS_ATTACH");
        break;
    case DLL_PROCESS_DETACH:  //当DLL被某进程卸载时调用
        MsgBox("DLL_PROCESS_DETACH");
        break;
    case DLL_THREAD_ATTACH:  //进程中有线程被创建时调用
        MsgBox("DLL_THREAD_ATTACH");
        break;
    case DLL_THREAD_DETACH:  //进程中有线程结束时被调用
        MsgBox("DLL_THREAD_DETACH");
        break;
    }
    return TRUE;
}

静态测试:

#include "stdafx.h"
#include "windows.h"

extern "C" VOID MsgBox(char *szMsg);
#pragma comment(lib, "FirstDll")

int main(int argc, char* argv[])
{
    MsgBox("Hello First Dll!");
    return 0;
}

动态测试:

#include "stdafx.h"
#include "windows.h"
typedef VOID (*PFUNMSG)(char *);

int main(int argc, char* argv[])
{
    HMODULE hModule = LoadLibrary("FirstDll.dll");  //动态加载dll文件
    if(hModule == NULL)
    {
        MessageBox(NULL, "Dll.dll 文件不存在", "DLL加载失败", MB_OK);
        return -1;
    }

    PFUNMSG pFunMsg = (PFUNMSG)GetProcAddress(hModule, "MsgBox");  //检索指定的动态链接库(DLL)中的输出库函数地址
    pFunMsg("Hello First Dll");
    return 0;
}


这里写图片描述
这里写图片描述

如果程序出错,可能是函数名被修饰了,解决:
将生成的Dll文件拖入该软件,点击如图按钮:
这里写图片描述
这里写图片描述
这里写图片描述
便可以看到正确的函数名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值