建立WIN32 DLL,并使用静态加载和动态加载
来源:互联网 发布:js 对象 函数 编辑:程序博客网 时间:2024/06/05 06:13
新建工程,选择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;}
- 建立WIN32 DLL,并使用静态加载和动态加载
- 静态加载dll和动态加载dll
- 静态加载dll和动态加载dll
- 静态加载dll和动态加载dll
- DLL的静态加载和动态加载
- 动态库DLL加载方式-静态加载和动态加载
- 动态库DLL加载方式-静态加载和动态加载
- 动态库DLL加载方式-静态加载和动态加载
- 动态加载DLL和静态加载DLL的步骤
- 动态加载DLL和静态加载DLL的步骤
- vc静态加载dll和动态加载dll
- vc静态加载dll和动态加载dll
- MFC静态加载dll和动态加载dll示例
- 如何使用DLL函数动态加载-静态加载
- 如何使用DLL函数动态加载-静态加载
- 动态(静态)加载DLL注意
- 动态加载和静态加载
- 使用LoadLibrary动态加载DLL并使用其中的类
- org.hibernate.usertype
- public boolean isMutable
- linux 字符设备驱动框架
- 判断一个图是否有环 无向图 有向图
- Address类的映射
- 建立WIN32 DLL,并使用静态加载和动态加载
- 讯飞云语音-语音合成常用参数配置
- package cxm;
- 讯飞云语音-设置合成参数TTS_PARAM_STALL_STYLE 等常量
- TestComparableRectangle
- DIV+CSS布局
- Oracle之分页查询
- 讯飞云语音-常见问题汇总
- 第五次练习赛解题报告及标程