• CC_DLL是干什么用的(转)


     在cocos2d-x中它是一个宏
    1 #if defined(_USRDLL)
    2     #define CC_DLL     __declspec(dllexport)
    3 #else         /* use a DLL library */
    4     #define CC_DLL     __declspec(dllimport)
    5 #endif

    所以其用于声明导入导出函数 

    __declspec(dllexport)   声明一个导出函数,一般用于dll中 
    __declspec(dllimport)   声明一个导入函数,一般用于使用某个dll的exe中

    关于__declspec(dllexport) 和__declspec(dllimport)如下:

    一、__declspec(dllexport):

            将一个函数声名为导出函数,就是说这个函数要被其他程序调用,即作为DLL的一个对外函数接口。

           通常它和extern    "C"   合用,形式如下:

    extern "C"
    {
        __declspec(dllexport) RETURN_TYPE FUNCTION()
      {
      }
    }
           这是由于在制作DLL导出函数时由于C++存在函数重载,因此__declspec(dllexport)    FUNCTION(int,int)    在DLL会被decorate,例如被decorate成为    function_int_int,而且不同的编译器decorate的方法不同,造成了在用GetProcAddress取得FUNCTION地址时的不便,使用extern    "C"时,上述的decorate不会发生,因为C没有函数重载,如此一来被extern"C"修饰的函数,就不具备重载能力。

    二、以下内容摘自MSDN:

    “在 32 位编译器版本中,可以使用__declspec(dllexport) 关键字从 DLL 导出数据、函数、类或类成员函数。__declspec(dllexport)将导出指令添加到对象文件(即obj文件),若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。例如:

    __declspec(dllexport) void __cdecl Function1(void);

    若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:

    class __declspec(dllexport) CExampleExport : public CObject
    { ... class definition ... };

    生成 DLL 时,通常创建一个包含正在导出的函数原型和/或类的头文件,并将__declspec(dllexport)添加到头文件中的声明。
    若要提高代码的可读性,请为__declspec(dllexport)定义一个宏并对正在导出的每个符号使用该宏:
    #define DllExport   __declspec( dllexport ) ”

    三、__declspec(dllexport) 与 .def

    模块定义 (.def) 文件是包含一个或多个描述各种 DLL 属性的 Module 语句的文本文件。
    1、二者的目的都是将公共符号导入到应用程序中或从 DLL 导出函数。
    2、添加 __declspec(dllexport)是为了提供不使用.def文件从 .EXE 或 .DLL 导出函数的简单方法。
    3、如果不使用 __declspec (dllimport) 或 __declspec(dllexport) 导出 DLL 函数,则 DLL 需要.def文件。
    4、并不是任何时候选择添加 __declspec(dllexport)而放弃.def的方式都是好的。如果DLL是提供给VC++用户使用的,只需要把编译DLL时产生的.lib提供给用户,它可以很轻松地调用你的DLL。但是如果DLL是供VB、PB、Delphi用户使用的,那么会产生一个小麻烦。因为VC++对于__declspec(dllexport) 声明的函数会进行名称转换,如下面的函数: 
         __declspec(dllexport) int __stdcall IsWinNT() 
         会转换为IsWinNT@0,这样你在VB中必须这样声明: 
         Declare Function IsWinNT Lib "my.dll" Alias "IsWinNT@0" () As Long 
         @的后面的数由于参数类型不同而可能不同。这显然不太方便。所以如果要想避免这种转换,就要使用.def文件方式。

     

    原文地址:http://www.cnblogs.com/imoon/archive/2013/01/04/2844453.html

  • 相关阅读:
    WF4.0 Beta1 自定义跟踪
    WF4.0 Beta1 流程设计器与Activity Designer
    新版本工作流平台的 (二) 权限算法(组织结构部分)
    WF4.0 Beta1 WorkflowInvoker
    WF4.0 基础篇 (十) Collection 集合操作
    WF4.0 基础篇 (十五) TransactionScope 事物容器
    WF4.0 基础篇 (六) 数据的传递 Arguments 参数
    WF4B1 的Procedural Activity 之InvokeMethod , InvokeMethod<T> 使用
    WF4.0 Beta1 异常处理
    WF4.0 Beta1 变量 Variables
  • 原文地址:https://www.cnblogs.com/wodehao0808/p/3524373.html
Copyright © 2020-2023  润新知