DLL 编写与使用

楼主
DLL 编写与使用
[P]DLL,Dynamic Link Library,动态链接库。这是微软的一项技术,必须包含<windows.h>。
[/P][P]
[/P]vs2010创建dll项目[P]流程: File|New|Project|Visual C++|Win32 | Win32 Console Application|DLL(Additional options|Export symbols)[/P][P]以工程名12345为例。[/P][P][upload=15769,0]09224056_1.jpg[/upload]
[/P][P]
[/P][P][P][P] [P][P][P][TABLE][tr][td][i][/i]  [/td][td][P][P]// The following ifdef block is the standard way of creating macros which make exporting [/P][P]// from a DLL simpler. All files within this DLL are compiled with the MY12345_EXPORTS[/P][P]// symbol defined on the command line. This symbol should not be defined on any project[/P][P]// that uses this DLL. This way any other project whose source files include this file see [/P][P]// MY12345_API functions as being imported from a DLL, whereas this DLL sees symbols[/P][P]// defined with this macro as being exported.[/P][P]#ifdef MY12345_EXPORTS[/P][P]#define MY12345_API __declspec(dllexport)[/P][P]#else[/P][P]#define MY12345_API __declspec(dllimport)[/P][P]#endif[/P][P]
[/P][P]// This class is exported from the 12345.dll[/P][P]class MY12345_API CMy12345 {[/P][P]public:[/P][P]      CMy12345(void);[/P][P]      // TODO: add your methods here.[/P][P]      void fun(char* str);[/P][P]};[/P][P]extern MY12345_API int nMy12345;[/P][P]
[/P][P]MY12345_API int fnMy12345(void);[/P][P][/P][/td][/tr][/TABLE][/P][P][/P][P][/P] [URL=https://code.csdn.net/snippets/423094] 来自CODE的代码片 [/URL][P]12345.h  [/P][P][/P][P][/P][P] [P][P][P][TABLE][tr][td][URL=http://blog.csdn.net/chuchus/article/details/37599915#L1][i][/i] [/URL][/td][td][P][P]// 12345.cpp : Defines the exported functions for the DLL application.[/P][P]//[/P][P]
[/P][P]#include "stdafx.h"[/P][P]#include "12345.h"[/P][P]
[/P][P]
[/P][P]// This is an example of an exported variable[/P][P]MY12345_API int nMy12345=0;[/P][P]
[/P][P]// This is an example of an exported function.[/P][P]MY12345_API int fnMy12345(void)[/P][P]{[/P][P]      return 42;[/P][P]}[/P][P]
[/P][P]// This is the constructor of a class that has been exported.[/P][P]// see 12345.h for the class definition[/P][P]CMy12345::CMy12345()[/P][P]{[/P][P]      return;[/P][P]}[/P][P]void CMy12345::fun(char* str){[/P][P]      cout<<str;[/P][P]}[/P][P][/P][/td][/tr][/TABLE][/P][P][/P][P][/P] [URL=https://code.csdn.net/snippets/423096] 来自CODE的代码片 [/URL][P]12345.cpp  [/P][P][/P]
[P][/P][P][P] [P][P][P][TABLE][tr][td][URL=http://blog.csdn.net/chuchus/article/details/37599915#L1][i][/i] [/URL][/td][td][P][P]// dllmain.cpp : Defines the entry point for the DLL application.[/P][P]#include "stdafx.h"[/P][P]
[/P][P]BOOL APIENTRY DllMain( HMODULE hModule,[/P][P]                       DWORD  ul_reason_for_call,[/P][P]                       LPVOID lpReserved[/P][P]                               )[/P][P]{[/P][P]      switch (ul_reason_for_call)[/P][P]      {[/P][P]      case DLL_PROCESS_ATTACH:[/P][P]      case DLL_THREAD_ATTACH:[/P][P]      case DLL_THREAD_DETACH:[/P][P]      case DLL_PROCESS_DETACH:[/P][P]            break;[/P][P]      }[/P][P]      return TRUE;[/P][P]}[/P][P][/P][/td][/tr][/TABLE][/P][P][/P][P][/P] [URL=https://code.csdn.net/snippets/423098] 来自CODE的代码片 [/URL][P]dllmain.cpp  [/P][P][/P]
[P][/P][P]
[/P][P]项目生成,就会有 12345.dll 12345.lib两个文件。[/P][P]头文件是声明[/P][P]lib是函数入口说明[/P][P]dll是函数体[/P]创建后的调用[P][P] [P][P][P][TABLE][tr][td][URL=http://blog.csdn.net/chuchus/article/details/37599915#L1][i][/i] [/URL][/td][td][P][P]//dll_use.cpp[/P][P]#include <iostream>[/P][P]#include "12345.h"[/P][P]#pragma comment (lib,"12345.lib")  //12345.dll 12345.lib 12345.h dll_use.cpp,four files,are in the same directory.[/P][P]using namespace std;[/P][P]int main(int argc, char *argv[])[/P][P]{[/P][P]      CMy12345 obj;[/P][P]      obj.fun("hi\n");[/P][P]      cout<<nMy12345<<endl;[/P][P]      cout<<fnMy12345();[/P][P]      getchar();[/P][P]      getchar();[/P][P]      return 0;[/P][P]}[/P][P][/P][/td][/tr][/TABLE][/P][P][/P][P][/P] [URL=https://code.csdn.net/snippets/423100] 来自CODE的代码片 [/URL][P]dll_use.cpp  [/P][P][/P]
[P][/P][P]运行效果:[/P][P][upload=15770,0]09224056_2.jpg[/upload][/P]
1楼
[QUOTE][b]下面引用由[@spiderman]发表的内容:[/b]
这是微软的一项技术,必须包含<windows.h>。
[/QUOTE]


文章第二句话就错了。谁说DLL必须包含<windows.h>???

2楼
为了证明DLL不必非要引用Windows.h,我们来做一个实验。
3楼
Test.c
我们写一个只有4行的非常简短的C语言程序,真的是非常非常的简短:

[CODE]__declspec(dllexport) int sum(int a, int b)  
{  
    return a + b;  
}[/CODE]
4楼
然后我们打开 Visual Studio Command Prompt,执行:

[CODE]
cl /c Test.c  
link /dll Test.obj
[/CODE]

[upload=15775,0]01.png[/upload]

然后再看看我们的目录里面,动态链接库已经生产好了:
[upload=15776,0]02.png[/upload]
5楼
即使没有Visual Studio,甚至于都没安装VC的编译器MSBuild,只要安装一个gcc,也照样生成动态连接库,只需在命令行下执行这么一条命令:[P]
[/P][P][CODE]gcc -shared -o Test.dll Test.c[/CODE][/P]

电脑版 Page created in 0.0703 seconds with 4 queries.