一、动态链接库(DLL)介绍

1. Non-MFC DLL:

指的是不用MFC的类库结构,直接用C语言写的DLL,其输出的函数一

般用的是标准C接口,并能被非MFC或MFC编写的应用程序所调用。

2. Regular DLL:

和下述的Extension Dlls一样,是用MFC类库编写的。明显的特点是

在源文件里有一个继承CWinApp的类。其又可细分成静态连接到MFC和动态连接到MFC上

的。但静态连接到MFC的动态连接库只被VC的专业般和企业版所支持。

动态链接库和MFC静态链接:这种DLL在链接过程中会将使用到得MFC类库复制一份到最终的DLL文件中

最终生成的DLL比较庞大且加载时不是很方便,但它可以在没有MFC类库DLL文件的机器上使用

动态链接库使用共享MFC DLL:这种DLL不会将用到的MFC类库复制到最终生成的DLL中,因此最终的DLL比较小,加载也很方便,但在没有MFC类库DLL文件的机器上无法使用,必须有MFC类库的支持

3.Extension DLL:

MFC扩展DLL,可以实现从MFC所继承下来的类的重新利用,可以导出C++类以及MFC派生类,使用这种DLL必须有MFC类库的支持,也就是说它只被用MFC类库所编写的应用程序所调用。

二、编写Non-MFC dll

1、打开visual studio 2008

2、file->new->Project…

3 、在弹出的“New project”窗口中,prject types子窗口中选择 visual C++,Templates子窗口中选择Win32 Project,然后在name处输入 pow,location处输入F:\vc2008dll,点击“OK”

4、在弹出的“win32 application wizard - pow”窗口中,点击“Next”;

5、在弹出的“win32 application wizard - pow”窗口中,Application type选项中选择DLL,Additional options选项中选择Export symbols,点击“Finish”

工程会自动生成对应的文件和代码,生成了pow.h和pow.cpp

6、在pow.h的文件末尾添加pow函数的声明

POW_API int pow(const int& x,const int& y);

//POW_API是自动生成的一个宏,它的作用是表明该函数是导入还是导出的

7、在Pow.cpp中添加pow函数的实现

POW_API int pow(const int& x,const int& y)

{

int z=1;

for(int i=0;i<y;i++)

z*=x;

return z;

}

编译后会在debug目录里生成pow.dll和pow.lib两个文件,其中pow.lib是动态链接库进行静态链接时使用

visual studio 2008默认的编译dll的调用约定是cdecl,若用其它程序调用该dll请注意调用约定,否则某些dll中的函数会抛出异常。修改vs2008的调用约定-project-->properties-->configuration properties-->C/C++-->advanced-->calling convention-->选择对应的方式!

三、静态调用Non-MFCdll

方式一

1、创建一个Win32 Console Application工程,工程名为test1。

2、将pow.h和pow.dll和pow.lib拷贝到F:\c++\test1\test1目录下,把Pow.dll拷贝一份放到F:\c++\test1\Debug目录里防止直接运行exe时找不到dll。

3、将pow.h添加到test1工程中

4、修改test.Cpp文件如下:

#include "stdafx.h"

#include <iostream>

#include "pow.h"

#pragma comment(lib,"pow.h")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

{

char a;

cout <<pow(3,3);

cin>>a;

return 0;

}

方式二

1、创建一个Win32 Console Application工程,工程名为test2。

2、将pow.dll和pow.lib拷贝到F:\c++\test2\test2目录下,把Pow.dll拷贝一份放到F:\c++\test2\Debug目录下防止直接运行exe时找不到dll。

3、新建一个头文件命名为test2.h

其文件如下:

#pragma comment(lib,"pow.lib")

//不使用pragma comment,而直接在工程的Setting->Link页的Object/Moduls栏填入notmfcdll.lib也可

__declspec(dllexport) int pow(const int& x,const int& y);

4、修改test.Cpp文件如下:

#include "stdafx.h"

#include "test2.h"

int _tmain(int argc, _TCHAR* argv[])

{

int a=0;

a=pow(3,6);

printf("%d",a);

char b;

b=getchar();

return 0;

}

三、动态调用Non-MFCdll

1、创建一个Win32 Console Application工程,工程名为test3。

2、将pow.dll拷贝到F:\c++\test3\test3目录下,把Pow.dll拷贝一份放到F:\c++\test\Debug目录下防止直接运行exe时找不到dll。

3、修改test3.Cpp文件如下:

#include <stdafx.h>

#include <stdio.h>

#include <windows.h>

typedef int (*MYPROC)( int, int);

int _tmain(int argc, _TCHAR* argv[])

{

int a=0;

char b;

HINSTANCE hInst;

MYPROC myproc;

//加载动态函数库

hInst = LoadLibrary(L"pow.dll");

if( hInst != NULL)

{

myproc = (MYPROC)GetProcAddress( hInst,"pow" );//得到DLL中的函数的指针

a=myproc(2,3);

printf("%d",a);

FreeLibrary(hInst);//卸载DLL

}

else

{

a=1;

printf("%d",a);

}

b=getchar();

return 0;

}

按F5运行程序,抛出异常,调试发现GetProcAddress函数返回为空。

因为visual studio 2008编译的dll导出函数是c++格式,而显示调用GetProcAddress函数是按照C格式查找函数,所以需修改pow.h文件,将导出函数包含在extern "C"{}中,如下:

extern "C"

{

POW_API int pow(int x, int y);

}

重新编译动态函数,将生成的pow.dll重新拷贝到调用dll的程序中就可以了!

导出函数包含在extern "C"{}中,使用静态调用方式二的方法调用该dll时格式也许调整如下:

修改头文件test2.h 即可,其文件如下:

#pragma comment(lib,"pow.lib")

__declspec(dllimport) int pow(const int& x,const int& y);

Visual studio2010 编写dll 及 使用dll相关推荐

  1. Visual C++ Windows 用来定位 DLL 的搜索路径

    Visual C++ Windows 用来定位 DLL 的搜索路径 通过隐式和显式链接,Windows 首先搜索"已知 DLL",如 Kernel32.dll 和 User32.d ...

  2. 软件安全之代码注入技术 向目标 PE 文件注入 DLL notepad lpk.dll 远程线程函数 提权函数 OpenProcess VirtualAllocEx

    实验 4 代码注入技术 引言 1.实验说明 代码注入是将用户代码注入到其他进程或者可执行文件中,实现拦截目标进程运行过程的关键信息.改变目标进程或可执行文件原本执行流程等目的 2.实验目的 本实验通过 ...

  3. DLL与MFC DLL

    比较大的应用程序都是由很多模块组成的,这些模块彼此协作,以完成整个软件系统的工作.其中可能存在一些模块的功能较为通用,在构造其他软件系统时仍会被使用.在构造软件系统时,如果将所有模块的源代码都静态编译 ...

  4. vc编译器 msvcr.dll、msvcp.dll的含义和相关错误的处理

    转自:http://blog.csdn.net/sptoor/article/details/6203376 很久没有写程式设计入门知识的相关文章了,这篇文章要来谈谈程式库 (Library) 连结, ...

  5. 【解决】Copying assembly from ‘Temp/Assembly-CSharp.dll‘ to ‘...../Assembly-CSharp.dll` ....

    开发平台:Unity 编程平台:Visual Studio 2017以上 使用语言:C#   问题描述: 原文 Copying assembly from 'Temp/Assembly-CSharp. ...

  6. linux下开发basic程序设计,使用 Visual Basic 编写基于 Unity3D 的计算器

    随着 .NET 全平台战略的推进,微软正在让以 C# 为先锋的 .NET 拥有跨平台特性.这个过程中一直有人想知道其它 .NET 语言对跨平台的支持有什么改进,熟悉 C# 但是喜欢用 VB 的我也不例 ...

  7. 海康搜索软件找不到msvcr120.dll,msvcr120.dll丢失怎样修复

    在我们打开海康软件的时候,提示软件找不到msvcr120怎么办?需要怎么修复呢?相信这个问题困扰着不少小伙伴,msvcr120.dll是一个Microsoft Visual C++程序所需的系统文件. ...

  8. 聊一聊ws2_32.dll和wsock32.dll

    Wsock32.Dll与Ws2_32.Dll区别 CSocket在Wsock32.Dll中实现,Socket API在Ws2_32.Dll实现  这两个Dll是两个不同层次的接口,调用关系如下:  网 ...

  9. 静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件。

    静态链接库(LIB)和动态链接库(DLL),DLL的静态加载和动态加载,两种LIB文件. 一. 静态链接库(LIB,也简称"静态库")与动态链接库(DLL,也简称"动态库 ...

  10. 如何注册全部DLL文件以及DLL简要说明

    将您下载的 "*. DLL" 文件复制到 "C:\Windows\system32\" 系统目录下然后按 "Win键+R" 或单击 &quo ...

最新文章

  1. Xcode 6 UITextField 键盘不弹出
  2. pytorch 加载模型:
  3. C++中常量成员函数的含义
  4. 前端学习(2618):vue插槽--默认插槽
  5. Java8新特性总结 -7.新API和工具
  6. 2021年数据科学家面试:4个基本SQL窗口函数介绍以及示例
  7. ++++++++++++++++++++++++++++++++++++++++++++1076+++++++++++++++++++++++++++++++++++++++++++++++++++
  8. fg jobs bg
  9. 西宁公交调度员招聘计算机题库,调度员考试题库.doc
  10. 【燃烧吧 切割机】 自制微型激光切割
  11. 雅俗共赏——广告词之很美很强大的汉语言
  12. C#串口通信——协议格式
  13. python中的请求方法_Python爬虫HTPP请求方法有哪些
  14. jquery中的data-icon和data-role
  15. Android的启动流程
  16. 语音识别提取视频文案
  17. 网络安全笔记-TCP/IP
  18. 一心多用多线程-Thread的api探险
  19. VSCode-解决更新代码时报would clobber existing tag
  20. java如何数字竖排输出_Java输出竖排文字

热门文章

  1. linux远程升级运行程序,在LINUX上对DSP程序远程升级的实现想法
  2. LINUX查找所有文件,按照时间排序
  3. 全网首发:gpg: gpg-agent 在此次会话中无法使用的解决办法
  4. 员工离职时,主管应该问相关竞业的两个问题
  5. 运行JProfiler:ERROR: Invalid license key. Aborting
  6. 就产品测试问题又吵架了
  7. 碰到一个摄像头预览画面跳帧的安卓设备
  8. configure:13747: error: You requested FFmpeg (h264, h263, theora, mp4v-es) but not found...die
  9. LINUX SHELL中echo如何处理特殊字符
  10. LINUX SHELL中大小写转换及注意事项