您的位置:首页 > 其它

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

2014-05-10 00:38 369 查看
新建工程,选择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 \n", 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 \n");
fun = (FUN)GetProcAddress(hInstance, "sum")
if (!fun)
printf("not find this fun \n");
k = fun(1, 2);
printf("%d \n", k);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: