zoukankan      html  css  js  c++  java
  • _declspec(dllimport)到底有什么用?(转载)

    1. 在导入动态链接库中的全局变量方面起作用:
    使用类似
    
    
    #ifdef _EXPORTING
    #define API_DECLSPEC __declspec(dllexport)
    #else
    #define API_DECLSPEC __declspec(dllimport)
    #endif
    
    
    可以更好地导出dll中的全局变量,比如按照的宏,可以在dll中这样导出全局变量:
    
    
    
    API_DECLSPEC CBtt g_Btt;
    
    
    然后在调用程序这样导入:
    
    API_DECLSPEC CBtt g_Btt;
    
    
    当然也可以使用extern关键字,比如在dll中这样导出全局变量:
    
    
    CBtt g_Btt;
    
    
    然后在调用程序这样导入:
    
    extern CBtt g_Btt;
    
    但据说使用__declspec(dllimport)更有效。
    
    
    
    2. __declspec(dllimport)的作用主要体现在导出类的静态成员方面,
    比如在动态链接库中定义这样一个导出类:
    
    
    class __declspec(dllexport) CBtt
    {
    public:
    CBtt(void);
    ~CBtt(void);
    public:
    CString m_str;
    static int GetValue()
    {
    return m_nValue;
    }
    private:
    static int m_nValue;
    };
    
    
    照上面这样声明,外部虽然可以使用CBtt类,但不能使用CBtt类的GetValue函数,一使用就会出现无法解析的外部符号 "public: static int CBtt::m_nValue" (?m_nValue@CBtt@@2HA)。只有如下声明才能使用CBtt类的GetValue函数:
    
    
    #ifdef _EXPORTING
    #define API_DECLSPEC __declspec(dllexport)
    #else
    #define API_DECLSPEC __declspec(dllimport)
    #endif
    class API_DECLSPEC CBtt
    {
    public:
    CBtt(void);
    ~CBtt(void);
    public:
    CString m_str;
    static int GetValue()
    {
    return m_nValue;
    }
    private:
    static int m_nValue;
    };
    
    
    3. 使用隐式使用dll时,不加__declspec(dllimport)完全可以,使用上没什么区别,只是在生成的二进制代码上稍微有点效率损失。
    
    
    
    a、 不加__declspec(dllimport)时,在使用dll中的函数时,编译器并不能区别这是个普通函数,还是从其它dll里导入的函数,所以其生 成的代码如下:
    
    call 地址1
    
    地址1:
    jmp 实际函数地址
    
    
    
    b、有 __declspec(dllimport)时,编译器知道这是要从外部dll导入的函数,从而在生成的exe的输入表里留有该项,以便在运行 exe,PE载入器加载exe时对输入地址表IAT进行填写,这样生成的代码如下:
    
    call dword ptr[输入表里哪项对应的内存地址] (注意:现在就不需要jmp stub了)。这里
    有兴趣的朋友可以参看《编译原理》和 PE文件格式。
    
    
    
    4.使用__declspec(dllimport)体现了语言的一种对称美,比如虽然!true就是表示false,但是我们还是需要false这个关键字,这里体现了一种对称美。

    参考文章:https://blog.csdn.net/mniwc/article/details/7993361

    新战场:https://blog.csdn.net/Stephen___Qin
  • 相关阅读:
    02、Rendering a Triangle
    [转]Unity性能优化之Draw Call
    [转]Directx11 3D空间坐标系认识
    设置让EditPlus不产生BAK文件
    深度优先搜索与广度优先搜索对比
    python多重继承新算法C3
    php的垃圾回收机制
    python脚本自动发邮件功能
    python的keyword模块
    EditPlus如何设置——自动换行
  • 原文地址:https://www.cnblogs.com/Stephen-Qin/p/12956329.html
Copyright © 2011-2022 走看看