哪位帮我解释一下这段dll代码执行的过程//MYDLL.h文件
////////////
#ifdef MYDLL_EXPORTS
#define PREDLL_API __declspec(dllexport)
#else
#define PREDLL_API __declspec(dllimport)
#endif#ifdef __cplusplus
extern "C" {
#endifPREDLL_API void TestFun();#ifdef __cplusplus
}
#endif///////////
//MYDLL.cpp文件
////////////
#include "stdafx.h"
#include "MYDLL.h"BOOL APIENTRY DllMain(
HANDLE hModule, 
DWORD ul_reason_for_call, 
LPVOID lpReserved
)
{
return TRUE;
}PREDLL_API void TestFun()
{
//函数实现
}

解决方案 »

  1.   

    补充:以上代码必须在工程属性中预定义 MYDLL_EXPORTS,否则报错
    预定义在编译之前就进行替换,
    那么在.h 文件和.cpp文件中的PREDLL_API,分别代表什么?
    对于预定义的执行顺序有点迷惑。
    望高人指点!
      

  2.   

    #ifdef MYDLL_EXPORTS
    #define PREDLL_API __declspec(dllexport)
    #else
    #define PREDLL_API __declspec(dllimport)
    #endif
    ==========
    如果定义了MYDLL_EXPORTS,PREDLL_API就用_declspec(dllexport)代替,表示导出
    没有定义表示导入,前者用在实现DLL时,后者用在引用这个DLL的EXE工程中
      

  3.   

    这样做是为了让DLL和调用者共用同一个h文件,在DLL项目中,定义MYDLL_EXPORTS,PREDLL_API就是导出;在调用该DLL的项目中,不定义MYDLL_EXPORTS,PREDLL_API就是导入。
      

  4.   

    PREDLL_API依赖于是否定义了MYDLL_EXPORTS来决定宏展开为__declspec(dllexport)还是__declspec(dllimport)展开为__declspec(dllexport)是DLL编译时的需要,通知编译器该函数是需要导出供外部调用的。
    展开为__declspec(dllimport)是给调用者用的,通知编译器,该函数是个外部导入函数。对于工程设置里面的预定义宏,是最早被编译器看到的。所以当编译器编译DLL工程中的MYDLL.cpp时,因为看到前面有工程设置有定义MYDLL_EXPORTS,所以就把PREDLL_API展开为__declspec(dllexport)了。