服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - VC6.0如何创建以及调用动态链接库实例详解

VC6.0如何创建以及调用动态链接库实例详解

2020-11-16 15:36C++教程网 C/C++

作为客户与后台的中介,为了更好的调节两方的关系,我明智滴选择了webservice以及动态链接库。在与客户c++使动态链接库方式,而与后台java,使用webservice来交流沟通

小弟在公司的职责,在上篇博客中已经简约介绍。这边博客主要介绍技术的应用而不在细究原理。因为公司项目着急,出结果要紧,并且咱也不是专注搞研究的,所以,基本懂了原理后,直接上手工作,搞出demo来最好。

至于公司工作情况,今天暂且略过,当然也不是一两句能够表达清楚的。后面会有相应的工作总结,敬请期待……

现在,废话少说,直奔主题——VC6.0中创建动态链接库。
作为客户与后台的中介,为了更好的调节两方的关系,我明智滴选择了webservice以及动态链接库。在与客户c++使动态链接库方式,而与后台java,使用webservice来交流沟通。
既然有了动态链接库,肯定大家会想到静态链接库。呵呵,这个是相对的。那这两者有什么区别呢?那又为什么选择了动态链接库呢?
静态链接库:是把lib文件也打包到了exe文件中。
动态链接库:没有把lib文件打包到exe文件中,若是使用,则直接加载卸载相应的dll文件。
并且,静态链接库中不允许包含静态链接库和动态链接库,而动态链接库中是允许包含静态链接库和动态链接库的。因为小弟封装的dll中是调用客户的dll,并且有可能包含另外自己的动态链接库。
鉴于此,小弟选择了动态链接库。
还有一点是,动态链接库,也是分为三种情况的。一是非MFC的dll(也就是控制台的dll),二是常规的MFC的dll(其中又分静态的dl和共享的dll),三是扩展的MFC 的dll。并且MFC的dll可以被MFC程序或者控制台程序调用。
因为小弟封装的dll,需要供MFC程序调用,所以选择使用了MFC常规的dll。并且使用控制台程序做测试。
首先,在新建工程中选择MFC AppWizard (dll)
然后在头.h文件中,声明被外界调用的函数

复制代码 代码如下:


extern "C" _declspec(dllexport) char* queryFunctionByFID(char* funcId);


声明后,在cpp文件中,实现此函数。

复制代码 代码如下:


char* queryFunctionByFID(char* funcId)
{
…………………………
具体的操作实现}


编译,build生成。OK,在Debug下生成相应的dll,至此动态链接库生成了。然后程序就可以直接使用此dll文件了。
然后呢。把dll文件copy到相应的测试dll程序(调用dll的程序)下。使用方式如下:
我测试dll程序中,是使用的控制台程序,这样简单方便,当然使用MFC程序也可以。
比如:我们新建一个控制台程序,然后在main方法中,写如下:

复制代码 代码如下:


//声明函数指针 写明函数参数个数,参数类型以及返回值类型
typedef char* (* queryFunctionByFID)(char*);
//加载动态链接库,返回DLL文件的句柄
HINSTANCE hDLL=NULL;
//加载动态链接库,dll名称要与刚才生成的dll名称保持一致。
hDLL=LoadLibrary("IProcessInstIn.dll");
queryFunctionByFID saveProcess=NULL;
//加载动态链接库中相应的函数
saveProcess=(queryFunctionByFID)GetProcAddress(hDLL,"queryFunctionByFID");
//真正的调用相应的函数
cout<<"结果是:"<<saveProcess("dd");
//调用完毕后释放资源
FreeLibrary(hDLL);


每一句的作用,注释已经表达清楚。若是有不懂的,可以联系我,互相交流一下。
其实,动态链接库,类似我们VS中的dll,只不过,当时只要把dll引用到相应的程序,然后直接可以使用。而在此,是我们手动加载,连接,释放dll。使用这种方式的动态链接库,我们可以很随意在我们程序中的任何地方都可以使用我们想调用的函数。
只要我们遵守了“加载,LoadLibrary——GetProcAddress——FreeLibrary”原则即可。使用相当方便。即可解脱了两者之间耦合的困扰,又可以加载释放方便。
调用静态链接库的做法如下
第一:把lib文件和dll文件两个文件全部放在客户端下,调用动态链接库时,只需要dll文件。
第二:在客户端中需要新建头文件,类似dll中的导出函数的头文件。
第三:在客户端调用dll文件中(cpp文件),添加预指令,也就是把lib文件显式加载进来。
如:#pragma comment (lib,"IProcessInstIn.dll")
第四:在button事件下,直接调用相应的方法。
如:cout<<"结果是:"<<queryFunctionByFID(相应的参数);
总之,调用静态链接库,相对于来说,比较简单,只要把相应的文件加载进来后,直接调用方法即可。但是调用动态链接库相对来说,比较灵活,何时使用何时加载,不使用了直接卸载即可。
任何事物都有优缺点,我们呢,就是充分利用他们的优点,在不同的场合不同的需求下使用不同的方式。
刚才我们在生成dll时,使用Debug版本下的dll,既然有可以选择Debug版本,根据我们的思维,肯定会想到,存在另外的版本。下篇博客中,我们会介绍一下Debug版本下的动态链接库和另一个版本Release版本下的动态链接库的区别,以及何时何地选择何种版本。

延伸 · 阅读

精彩推荐
  • C/C++c/c++实现获取域名的IP地址

    c/c++实现获取域名的IP地址

    本文给大家汇总介绍了使用c/c++实现获取域名的IP地址的几种方法以及这些方法的核心函数gethostbyname的详细用法,非常的实用,有需要的小伙伴可以参考下...

    C++教程网10262021-03-16
  • C/C++使用C++制作简单的web服务器(续)

    使用C++制作简单的web服务器(续)

    本文承接上文《使用C++制作简单的web服务器》,把web服务器做的功能稍微强大些,主要增加的功能是从文件中读取网页并返回给客户端,而不是把网页代码...

    C++教程网5492021-02-22
  • C/C++深入C++拷贝构造函数的总结详解

    深入C++拷贝构造函数的总结详解

    本篇文章是对C++中拷贝构造函数进行了总结与介绍。需要的朋友参考下...

    C++教程网5182020-11-30
  • C/C++关于C语言中E-R图的详解

    关于C语言中E-R图的详解

    今天小编就为大家分享一篇关于关于C语言中E-R图的详解,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看...

    Struggler095962021-07-12
  • C/C++C语言main函数的三种形式实例详解

    C语言main函数的三种形式实例详解

    这篇文章主要介绍了 C语言main函数的三种形式实例详解的相关资料,需要的朋友可以参考下...

    ieearth6912021-05-16
  • C/C++c/c++内存分配大小实例讲解

    c/c++内存分配大小实例讲解

    在本篇文章里小编给大家整理了一篇关于c/c++内存分配大小实例讲解内容,有需要的朋友们可以跟着学习参考下。...

    jihite5172022-02-22
  • C/C++C语言实现双人五子棋游戏

    C语言实现双人五子棋游戏

    这篇文章主要为大家详细介绍了C语言实现双人五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    两片空白7312021-11-12
  • C/C++OpenCV实现拼接图像的简单方法

    OpenCV实现拼接图像的简单方法

    这篇文章主要为大家详细介绍了OpenCV实现拼接图像的简单方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    iteye_183805102021-07-29