码迷,mamicode.com
首页 > 其他好文 > 详细

DLL生成与使用的全过程

时间:2017-09-08 10:06:13      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:基于   info   res   efi   lsp   使用   dllexport   err   lang   

由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\n");
  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.       编译连接,执行。


DLL生成与使用的全过程

标签:基于   info   res   efi   lsp   使用   dllexport   err   lang   

原文地址:http://www.cnblogs.com/azbane/p/7492820.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!