DLL&LIB 【留给自己用】

<1>_declspec(dllexport) 在要export的函数、类、数据前加上,在C调用约定、C编译情况下可以去掉函数名的下划线前缀,这样一C编译的方式编译函数;

<2>当需要使用C++编译器编译成为C形式的函数时,要在前面加上extern"C"

<3>.def导出的dll把函数地址保留了

1、win32形式的dll,下面这种的使用比较其他的方便一些,像使用函数一样

<myDll.h>

#ifdef __cplusplus

#define EXPORT extern"C" __declspec(dllexport)

#else

#define EXOPRT extern __declspec(dllexport)

#endif


EXPORT int Add(int add1, int add2);

<myDll.cpp>

#include<windows.h>

#include"myDll.h"


int WINAPI DllMain(HINSTANCE hInstance, DWORD fdsReason, PVOID pvReserved){

return TRUE;

}

EXPORT int Add(int add1, int add2){

return add1 + add2;

}


使用dll的项目在编译连接的时候注意将.h和.dll以及.lib文件拷贝到相关的目录下面,并且需要设置依赖dll属性


使用dll也很方便,直接包含dll的头文件,就可以像使用函数那样直接使用

#include "myDll.h"

#include "stdafx.h"

int APIENTRY WinMain()(HINSTANCE hInstance,

                    HINSTANCE hPrevInstance,

                    LPSTR     lpCmdLine,

                    int       nCmdShow){

int sum = Add(1, 2);

return 0;

}

2、动态C函数库lib和dll,即函数lib和dll的使用,不需要没有.h头文件。但是需要知道函数的定义形式

<fundll.c>

_declspec(dllexport) int Add(int add1, int add2){

return add1 + add2;

}

//使用.lib的方式:

编译后将生成的lib拷贝到需要使用的地方

<fundlllibTest.c>

#pragma comment(lib, "../fundll.lib")

int main(){

int sum = Add(1, 2);

return 0;

}

//dll的使用方式

HMODULE hModule = LoadLibrary("");


3、静态C函数库(.lib)的使用,区别和C动态库的生成方式

<staticlib.c>

int Add(int add1, int add2){

return add1 + add2;

}

//编译即可,将生成的.lib文件放在需要的目录下


<staticlibTest.c>

#pragma comment(lib, "../staticlib.lib")//如果lib放在系统文件夹下,可以不需要这句

int main(){

int sum = Add(1, 2);

return 0;

}


4、C++中Win32的函数动态库dll的使用:

<fundll.cpp>

_declspec(dllexport) int Add(int add1, int add2){

return add1 + add2;

}

Win32工程使用.dll方式:

编译后即可,将生成的dll拷贝到需要调用的地方

<fundllTest.cpp>

HINSTANCE hInstance = LoadLibrary("fundll.dll");

typedef int (*pAdd)(int add1, int add2);

pAdd Add = (pAdd)GetProcAddress(hInstance, "Add");//另外还有其他方法

int sum = Add(1,2);

FreeLibrary(nDll);//卸载动态库


5、静态C++库(.lib)的使用:

<wincpplib.cpp>

int CPP_Add(int add1, int add2){

return add1 + add2;

}


//usewincpplib使用静态C++库

#pragma comment(lib, "../cppstatic.lib")

_declspec(dllimport)int Add(int add1, int add2);//_declspec(dllimport)可以不加


//在c++中使用c库文件

#pragma comment(lib, "../cstatic.lib")

extern"C" _declspec(dllimport)int C_Add(int add1, int add2);//_declspec(dllimport)可以不加


int main(){

int sumcpp = CPP_Add(1, 2);

int sumc = C_Add(1, 2);

return 0;

}

6、调用C++动态库dll:

<wincppdll.cpp>

//显示连接动态库,不能加_declspec(dllexport),由.def文件说明导出

int cppAdd(int add1, int add2){

return add1 + add2;

}


int cppSub(int sub1, int sub2){

return sub1 - sub2;

}


//这个保留为隐式连接动态库,以作对比

_declspec(dllexport)int cppMul(int mul1, int mul2){

return mul1 * mul2;

}


<wincppdll.def>

LIBRARY WinCPPDLL

EXPORTS

cppAdd @1

cppSub @2


//使用方式

<wincppdllTest.cpp>

#include "windows.h"

typedef int (*pcppAdd)(int add1, int add2);

typedef int (*pcppSub)(int sub1, int sub2);

typedef int (*pcppMul)(int mul1, int mul2);


int main(){

//.def导出的dll把函数地址保留了

HMODULE hModule = LoadLibrary("wincppdll.dll");

pcppAdd cppAdd = (pcppAdd)GetProcAddress(hModule, "cppAdd");

int sum = cppAdd(1, 2);

...//其他相同操作

FreeLibrary(hModule);

}


7、类的动态链接库产生(lib/dll)和使用:

<dllclass.h>

#ifndef __DLLCLASS__

#define __DLLCLASS__

#ifdef MY_DLLCLASS_EXPORTS

#define EXT_CLASS _declspec(dllexport)

#else

#define EXT_CLASS _declspec(dllimport)

#endif

class EXT_CLASS CMath{

public:

int Add(int add1, int add2);

};


#endif


<dllclass.cpp>

#define MY_DLLCLASS_EXPORTS

#include "dllclass.h"

#include "windows.h"

#include "stdio.h"

BOOL WINAPI DLLMain(HINSTANCE hInstance, DWORD fdwReason, LPVOID lpvReserved){

printf("Load...\n");

switch(fdwReason){

case DLL_PROCESS_ATTACH:

printf("Load...\n");

break;

case DLL_PROCESS_DETACH:

printf("UNLoad...\n");

break;

}

return TRUE;

}


int CMath::Add(int add1, int add2){

return add1 + add2;

}


//lib使用

#include "../dllclass.h"

#pragma comment(lib, "../dllclass.lib")

int main(){

CMath math;

int sum = math.Add(1, 2);

return 0;

}

//dll的使用

LoadLibrary();


本文出自 “BaggerSky” 博客,谢绝转载!

你可能感兴趣的:(DLL&LIB)