zoukankan      html  css  js  c++  java
  • DLL 生成与使用的全过程

    转载自

    水滴的博客
    http://blog.sina.com.cn/spiritofwater   个人学习用

      分类: 技术

    由dll导出的lib文件: 包含了每一个dll导出函数的符号名和可选择的标识号以及dll文件名,不含有实际的代码(这里的lib文件和静态库是不一样的),其中的导出导入函数都是跳转指令,直接跳转到DLL中的位置。基于这样一句话可以看出在编译一个程序的时候,编译器先通过头文件知道要使用函数的格式,然后在lib文件中(这里的lib文件名是可以随便更换的)查找这个函数在dll文件中的具体地址,从而知道这个函数的入口点。其次由于lib包含了dll文件名,所以在执行exe程序的时候,dll文件的名称是不能更改的。
    一、生成DLL

     

    1.       新建DLL工程

    生成DLL可以多种方法,这里介绍一种。在VS中,新建一个空的项目,选Win32 Console Application,新建完后修改工程属性:把生成EXE改为生成DLL

     

     

     

    2.       源代码:

     

    ShowInfo.h

    1. #ifdef SHOWINFO_EXPORTS
    2. #define SHOWINFO_API __declspec(dllexport)
    3. #else
    4. #define SHOWINFO_API __declspec(dllimport)
    5. #endif
    6. extern "C" SHOWINFO_API void fnShowInfo(void);

    ShowInfo.c:

    1. #define SHOWINFO_EXPORTS
    2. #include "ShowInfo.h"
    3. #include <stdio.h>
    4.  
    5. SHOWINFO_API void fnShowInfo(void)
    6. {
    7. printf("Crab ");
    8. }

    3.       编译连接,生成dll.dll文件

     

    ps:

    1. 特别要注意要在ShowInfo.c文件的开头加上#define SHOWINFO_EXPORTS

    2. 在ShowInfo.h中声明函数的时候要加上 extern "C", 因为如果该函数可能会被c++ 程序调用。

    二、        使用DLL

     

    1.       新建工程

    新建一个Win32 Console Application,选择空的工程。

     

    2.       源代码:

     

     

     

     

     

    main.cpp

     

    #include <windows.h> #include <iostream> using namespace std;
    typedef   void   (*DllFn)(void); int main() {      HINSTANCE    hInst = LoadLibrary(TEXT("ShowInfo.dll"));      if(hInst)      {         DllFn a =(DllFn) GetProcAddress(hInst,"fnShowInfo");         if(a)             a();         else             cout<<"ERROR on GetProcAddress"<<endl;         FreeLibrary(hInst);      }      else         cout<<"Error on Load library"<<endl; }
    ps: a. 用 LoadLibrary 可能会出现 “不能将参数 1 从‘const char [13]’转换为‘LPCWSTR’”的错误,这时需要用到TEXT()函数。 b. 由于用了LoadLibrary函数,所以dll的文件名可以改变,只要文件名和LoadLibrary中的参数一样,就可以了。

     

     

    3.       将上面工程生成的dll.dll文件复制到此工程的目录下,保证源文件与DLL文件在同一目录下。如果生成的EXE文件要直接运行,则要保证EXE文件与DLL文件在同一目录下。

    4.       编译连接,执行。

  • 相关阅读:
    二、Java面向对象(11)_final修饰符
    二、Java面向对象(10)_代码块
    二、Java面向对象(9)_面向对象——多态思想
    二、Java面向对象(8)_继承思想——Object类
    二、Java面向对象(8)_继承思想——子类初始化过程
    二、Java面向对象(8)_继承思想——super关键字
    二、Java面向对象(8)_继承思想——方法覆盖
    WP8.1 RT 生命周期详解‏‏‏‏‏‏‏‏‏‏‏‏‏
    将十六进制色值转换成Color
    WindowsPhone8.1RT建立空白应用挂起没反应的解决方案
  • 原文地址:https://www.cnblogs.com/xifengib/p/5978238.html
Copyright © 2011-2022 走看看