dll初探

main.h

#ifndef __MAIN_H__
#define __MAIN_H__

#include <windows.h>

/*  To use this exported function of dll, include this header
 *  in your project.
 */
/** __declspec(dllexport)
使用一个方法,一个是提供者,一个是使用者,二者之间的接口是头文件。
头文件中声明了方法,
在提供者那里方法应该被声明为__declspec(dllexport),
在使用者那里,方法应该被声明为__declspec(dllimport)。
*/
#ifdef BUILD_DLL
    #define DLL_EXPORT __declspec(dllexport)
#else
    #define DLL_EXPORT __declspec(dllimport)
#endif

/**
*/
/**__cplusplus是cpp中的自定义宏,如果定义了这个宏表示这是一段cpp的代码,
也就是说,上面的代码的含义是:如果这是一段cpp的代码,那么加入extern "C"{和}处理其中的代码。
*/
/**因为c++支持重载,会把函数名编译成  _函数名_参数类型_参数类型 而编译成 _函数名所以c++无法直接调用c函数。处理方法如下。
*/
#ifdef __cplusplus /*如果采用了C++,如下代码使用C编译器;*/
extern "C"
{
#endif
/*采用C编译器编译的C语言代码段*/
void DLL_EXPORT SomeFunction(const LPCSTR sometext);

#ifdef __cplusplus
}
#endif

#endif // __MAIN_H__

main.cpp

#include "main.h"
#include<iostream>
using namespace std;
// a sample exported function
void DLL_EXPORT SomeFunction(const LPCSTR sometext)
{
    MessageBoxA(0, sometext, "DLL Message", MB_OK | MB_ICONINFORMATION);
}
/**
DLL能够定义两种函数,一种是导出函数,一种是内部函数。导出函数可以被其他模块调用,而内部函数只能被定义这个函数的模块调用。
*/
/**
DllMain 是动态链接库的入口点,库的入口点函数仅供操作系统使用,windows在库装载、卸载、进程中线程创建和结束时调用入口函数,以便动态链接库可以采取相应的动作。
hinstDLL是DLL模块的句柄,即本动态链接库模块的实力句柄,数值上是系统将这个文件的映象加载到进程的地址空间时使用的基地址;
fdwReason 是本次调用的原因。
lpvReserved 没有被使用。
*/
extern "C" DLL_EXPORT BOOL APIENTRY DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
{
    switch (fdwReason)
    {
        case DLL_PROCESS_ATTACH:
            // attach to process
            // return FALSE to fail DLL load
            cout<<"DLL_PROCESS_ATTACH"<<endl;
            break;

        case DLL_PROCESS_DETACH:
            // detach from process
            cout<<"DLL_PROCESS_DETACH"<<endl;
            break;

        case DLL_THREAD_ATTACH:
            // attach to thread
            cout<<"DLL_THREAD_ATTACH"<<endl;
            break;

        case DLL_THREAD_DETACH:
            // detach from thread
            cout<<"DLL_THREAD_DETACH"<<endl;
            break;
    }
    return TRUE; // succesful
}


使用extern c的原因详见百度百科

两种调用方式
* 显式调用
* 隐式调用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值