Visual studio 使用C语言 生成DLL 文件 并用 C 调用DLL

生成DLL:

新建项目-C++-动态链接库(DLL)

项目-右键-属性-C/C++-预编译头:不使用预编译头。

 项目-右键-属性-C/C++-高级:编译为:C。

添加相应的.h和.c文件

在.h中,对外开放的接口前 加注 __declspec(dllexport)

生成后,在Debug目录下会产生一个.dll 和 一个.lib文件

调用DLL:

引入dll的方法:

1、LoadLibray 一般是动态加载DLL时(不需要对应的头文件和LIB)。动态调用方式是由编程者用API函数加载和卸载DLL来达到调用DLL的目的,使用上较为复杂,但是能更加有效的使用内存,是编制大型应用程序时的重要方式。

2、#pragma comment 一般是静态加载DLL时(对应的头文件、DLL和LIB缺一不可,并且生产的EXE没有找到DLL文件就会导致“应用程序初始化失败”)。静态调用方式由编译系统完成对DLL的加载和应用程序时DLL卸载的编码,简单实用但不灵活。

3、#import指令用于从一个类型库中结合信息。该类型库的内容被转换为C++类,主要用于描述COM界面。

步骤:

将.dll 和 .lib放在与Debug同级目录

项目右键-属性-VC++目录-库目录-将.dll和.lib所在文件夹目录写入库目录中

项目-资源文件右键添加现有项-将.lib添加进去 或者 直接#pragma comment(lib,"Dll1.lib")

需要使用三个函数:LoadLibrary,GetProcAddress和FreeLibrary

 HMODULE module = LoadLibraryA("CreatDll.dll");
    if (module == NULL) 
    {
        system("error load");
    }

test_print = (void(*)(char const*))GetProcAddress(module, "test_print");

if ( test_print != NULL) 
    {
         test_print("输出测试");
    }

FreeLibrary(module);

.lib和.dll区别

引用网上的资料:

1)lib是编译时需要的,dll是运行时需要的。
如果要完成源代码的编译,有lib就够了。
如果要使动态连接的程序运行起来,有dll就够了。
在开发和调试阶段,当然最好都有。
(2)一般的动态库程序有lib文件和dll文件。lib文件是必须在编译期就连接到应用程序中的,而dll文件是运行期才会被调用的。如果有dll文件,那么对应的lib文件一般是一些索引信息,具体的实现在dll文件中。如果只有lib文件,那么这个lib文件是静态编译出来的,索引和实现都在其中。静态编译的lib文件有好处:给用户安装时就不需要再挂动态库了。但也有缺点,就是导致应用程序比较大,而且失去了动态库的灵活性,在版本升级时,同时要发布新的应用程序才行。
(3)在动态库的情况下,有两个文件,一个是引入库(.LIB)文件,一个是DLL文件,引入库文件包含被DLL导出的函数的名称和位置,DLL包含实际的函数和数据,应用程序使用LIB文件链接到所需要使用的DLL文件,库中的函数和数据并不复制到可执行文件中,因此在应用程序的可执行文件中,存放的不是被调用的函数代码,而是DLL中所要调用的函数的内存地址,这样当一个或多个应用程序运行时再把程序代码和被调用的函数代码链接起来,从而节省了内存资源。从上面的说明可以看出,DLL文件必须随应用程序一起发行,否则应用程序将会产生错误。

发布了16 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Hilaph/article/details/104917856