建立WIN32 DLL,并使用静态加载和动态加载

新建工程,选择win32 dll

编写.cpp(或.c)

MyDll.cpp

#include "windows.h" 

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved)
{
	return TRUE; 
} 
extern "C" _declspec(dllexport)int sum(int a, int b) 
//extern "C" int sum(int a, int b) 
{
	return a+b;
}

extern "C"
(1) 被extern限定的函数或变量是extern类型的
如果文件a.c需要引用b.c中变量int v,就可以在a.c中声明externint v  被引用的变量v的链接属性必须是外链接(external)的
(2) 被extern "C"修饰的变量和函数是按照C语言方式编译和连接的
C和C++编译产生的函数名不同,C为_name,C++为_name_int_int这样的名字包含了函数名、函数参数数量及类型信息,C++就是靠这种机制来实现函数重载的
可以使用__declspec(dllexport)关键字从 DLL 导出数据、函数、类或类成员函数。
__declspec(dllexport)将导出指令添加到对象文件,若要导出函数,__declspec(dllexport)关键字必须出现在调用约定关键字的左边(如果指定了关键字)。
例如:
__declspec(dllexport) void __cdecl Function1(void);
若要导出类中的所有公共数据成员和成员函数,关键字必须出现在类名的左边,如下所示:
class __declspec(dllexport) CExampleExport : public CObject
{ ... class definition ... };


或者使用def文件告诉编译器不要改函数的名字

可以在这工程里面加一个.h头文件,将要用的函数包含进去,在使用DLL的时候将.h文件拷贝到工程目录下,直接#include进.h,就不用声明函数了。

静态包含DLL

建立win32 console app   UseDll

UseDll.c

#include <stdio.h>
#pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入
int sum(int a, int b);//函数声明,若有.h头文件,加入即可
int main()
{
	k = sum(1, 2);
	printf("%d 
", k);
	return 0;
}


将.dll(动态库)放入运行程序目录里,将.lib(引入库)放入工程目录下


动态加载DLL

建立win32 console app   UseDll

UseDll.c

#include <stdio.h>
#pragma comment(lib,"MFCDll"); //或者在project->set->link里面引入
int sum(int a, int b);//函数声明,若有.h头文件,加入即可

typedef int (*FUN)( );//指向函数的指针FUN,在C中,空为0或多个参数,C++中...为0或多个参数。指针函数在函数参数中可用int (*)()
FUN   fun;
HINSTANCE hInstance;

//FARPROC lpFunction;//查看宏可知其为远指针,指向使用_stdcall调用约定(C++默认调用约定,此处加载的DLL为C程序默认使用_cdecl)的函数
int k;

int main()
{
	hInstance = LoadLibrary("MyDll.dll");
	if(!hInstance)
		printf("Not Find this Dll 
");
	fun = (FUN)GetProcAddress(hInstance, "sum")
	if (!fun)
		printf("not find this fun 
");
	k = fun(1, 2);
	printf("%d 
", k);
	return 0;
}


原文地址:https://www.cnblogs.com/yan456jie/p/5369558.html