




已阅读5页,还剩8页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC DLL学习 1-用VS创建DLL动态链接库1.1 创建dll项目1.2 为dll项目编写源文件头文件dllDemo.hexternC_declspec(dllexport)intSum(inta,intb);/加法函数。externC_declspec(dllexport)intMax(inta,intb);/取较大值函数externC_declspec(dllexport)intMin(inta,intb);/取较小值函数源文件dllDemo.cpp大气象 #includedllDemo.hexternC_declspec(dllexport)intSum(inta,intb)returna+b;externC_declspec(dllexport)intMax(inta,intb)if(a=b)returna;elsereturnb;externC_declspec(dllexport)intMin(inta,intb)if(a=b)returnb;elsereturna;1.3 生成dll文件编译源文件,如果没有出现错误提示,那么,在项目文件根目录的Debug文件夹内会生成一个dll文件“dllDemo.dll”。调用新建了个MFC单对话框项目,将“dllDemo.dll”和”dllDemo.lib”文件复制到本项目的Debug目录下,在VC工作空间的文件视图下面将”dllDemo.lib”添加到项目中在对话框头文件添加引用:大气象 /FileOperDlg.h:头文件/#pragmaonceexternC_declspec(dllimport)intSum(inta,intb);externC_declspec(dllimport)intMax(inta,intb);externC_declspec(dllimport)intMin(inta,intb);/CFileOperDlg对话框classCFileOperDlg:publicCDialog/构造public:CFileOperDlg(CWnd*pParent=NULL);/标准构造函数/对话框数据enumIDD=IDD_FILEOPER_DIALOG;protected:virtualvoidDoDataExchange(CDataExchange*pDX);/DDX/DDV支持/实现protected:HICONm_hIcon;/生成的消息映射函数virtualBOOLOnInitDialog();afx_msgvoidOnSysCommand(UINTnID,LPARAMlParam);afx_msgvoidOnPaint();afx_msgHCURSOROnQueryDragIcon();DECLARE_MESSAGE_MAP()public:CStringm_info;调用:CStringstr;intc=Sum(4,5);/c=Max(5,6);/c=Min(5,6);str.Format(%d,c);AfxMessageBox(str);调试直接运行,选择一个调用dll的exe确定之后,就可以调试了,设置个断点试试。参考:VC+的DLL应用(含Demo演示)作者:一点一滴的Beer / 在大学大一的时候学的是C,然后后来大二的时候专业又开了C+这个课程,然后再后来自己又自学了一点VC+,大三的时候也试着编写过一个MFC的最简单的窗口程序。到大四的时候,自己又做了一个GIS的项目,是用C#.NET来编写的,然后发现C#上手好容易,而且还大部分语法规则都沿用了C,C+的习惯,于是觉得C+实在是没有一点优势可言啊。但这个暑假的实习经历又改变了我的观点:C+在写窗口程序虽然麻烦,但是却什么能做,而且对比C#来说,对运行环境的要求不高,不用像C#程序在安装之前还要安装100M多的运行.NET环境。C+和C#各有优缺,目前我对它们俩的定位是:C+用来写一些底层的程序,比如驱动,或者是一些算法类型的函数接口,然后用C#来调用这些接口并进行界面设计。如何函数的实现跨语言呢?显然DLL是个很重要的内容,故在此对VC+的DLL模块进行介绍。1 用VC创建DLL动态连接库1.1 创建dll项目然后选择“一个空的dll工程”,然后点击“确定”便完成了“创建dll项目”的流程。1.2 为dll项目编写源文件新建两个文件:dllDemo.h, dllDemo.cpp 在头文件”dllDemo.h”中声明三个接口函数: extern C _declspec(dllexport) int Sum(int a,int b);/加法函数。extern C _declspec(dllexport) int Max(int a, int b);/取较大值函数extern C _declspec(dllexport) int Min(int a, int b);/取较小值函数然后在“dllDemo.cpp”文件中实现三个接口函数:#include dllDemo.hextern C _declspec(dllexport)int Sum(int a, int b)return a+b;extern C _declspec(dllexport)int Max(int a, int b)if(a=b)return a;elsereturn b;extern C _declspec(dllexport)int Min(int a, int b)if(a=b)return b;elsereturn a;1.3 生成dll文件编译源文件,如果没有出现错误提示,那么,在项目文件根目录的Debug文件夹内会生成一个dll文件“dllDemo.dll”。2 DLL调用2.1 用C+调用显式链接新建一个Win32的控制台程序进行显式调用:1. 新建“dllConsoleEvident”的Win32控制台程序项目2. 新建cpp文件“dllConsoleEvident.cpp”3. 将在第一节中,在Debug目录下编译生成的“dllDemo.dll”(显式调用时只需要这一个文件就够了)文件复制到“dllConsoleEvident”项目下的Debug文件夹根目录下4. 在“dllConsoleEvident.cpp”文件中编写以下代码对dll中的函数进行显式调用 代码 /动态加载DLL文件#include #includevoid main(void)typedef int(*pMax)(int a,int b);/函数指针typedef int(*pMin)(int a,int b);pMax Max=NULL;pMin Min=NULL;HINSTANCE hDLL;hDLL=LoadLibrary(MyDll.dll);/加载动态链接库MyDll.dll文件;Max=(pMax)GetProcAddress(hDLL,Max);Min=(pMin)GetProcAddress(hDLL,Min);if (Max)/如果取出函数成功,则执行下面的语句int A=Max(5,8);cout比较的结果为A;if (Min)int B=Min(5,8);cout比较的结果为B;FreeLibrary(hDLL);/卸载MyDll.dll文件;2.2 用C+隐式链接(Win32控制台程序)新建一个Win32控制台程序演示静态调用1. 利用向导新建“dllConsoleStaticDemo”的空工程2. 将“dllDemo.dll”和“dllDemo.lib”文件复制到Debug目录下,并在项目中包含“dllDemo.lib”文件(或者),否则会出现dll函数找不到的连接错误3. 新建“dllConsoleStaticDemo.cpp”文件,并写入如下代码: extern C_declspec(dllimport) int Sum(int a,int b);extern C_declspec(dllimport) int Max(int a,int b);extern C_declspec(dllimport) int Min(int a,int b);#include void main()int c=Sum(4,5);c=Max(5,6);c=Min(5,6);cout 1000#pragma once#endif / _MSC_VER 1000/ CDllMfcDemoDlg dialogextern C_declspec(dllimport) int Sum(int a,int b);extern C_declspec(dllimport) int Max(int a,int b);extern C_declspec(dllimport) int Min(int a,int b);4.在窗体界面上,双击“确定”按钮,进入到OnOk()的事件响应函数体,编写调用代码: void CDllMfcDemoDlg:OnOK() / TODO: Add extra validation here int c=Sum(4,5); c=Max(5,6); c=Min(5,6); CDialog:OnOK();通过设置断点单步运行就可以看到dll文件中的函数已经被成功调用了。2.4 用C#跨语言调用C#控制台程序调用VC+建立一个dll:1. 用Visual Studio建立一个控制台程序2. 将“dllDemo.dll”文件复制到项目的Debug目录下面3. 在“Program.cs”中编写如下代码 代码 using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;/引入dll文件中的函数namespace ConsoleDllDemoclass Program/引入dll文件中的函数DllImport(dllDemo.dll)private static extern int Sum(int a, int b);DllImport(dllDemo.dll)private static extern int Max(int a, int b);DllImport(dllDemo.dll)private static extern int Min(int a, int b);static void Main(string args)int a = Sum(3, 5);Console.WriteLine(a);Console.WriteLine(Max(5,10);Console.WriteLine(Min(12,25);Console.ReadKey();/要按键才退出。然后断点单步运行,便可以看到调用函数的结果了。关于DLL的调用的更详细内容可以参考另外一些文章:/course/3_program/c+/cppsl/2008127/97781.html/283/2640283_2.shtml3 dll调试方法在建立了dll项目后,并写好相应的实现代码,点击“运行”,会弹出现在的对话框:然后浏览,找到一个调用了此dll文件的执行文件“*.exe”文件,然后就可以对dll文件进行断点调试了。这个“*.exe”文件可以是任何平台的,C+也可以,C也可以,C#也可以,只要这个执行文件调用了dll文件中的函数即可。如果想更换调试的“*.exe”文件,可以在“工程设置”对话框中的“调试”选项卡进行设置,浏览找到用户需要的“*.exe”文件说明:以VC+环境中调用此dll为例,运行dllDemo项目,然后会调用“*.exe”文件,如果此exe文件含有源文件,而且刚好在源文件的Debug目录下面,那么,可以同时在exe文件的源文件中设置断点,进行dll和调用dll两个程序的联调。(好像跨语言调用的时候不能进行联调,笔者只在C+互相调用的时候联调成功过,但C#调用的时候没有联调成功,这个问题有待解决)4. DLL返回数据类型探究目前写的DLL函
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年学历类自考专业(建筑工程)建筑经济与企业管理-工程地质及土力学参考题库含答案解析(5套)
- 2025年学历类自考专业(建筑工程)建筑施工(一)-混凝土结构设计参考题库含答案解析(5套)
- 月嫂礼仪知识培训方案设计课件
- 2025年学历类自考专业(建筑工程)土力学及地基基础-建筑经济与企业管理参考题库含答案解析(5套)
- 别墅建筑方案设计软件(3篇)
- 新能源产品创新趋势与2025年市场需求匹配策略研究报告
- 护理业务讲座内容
- 铁路运输合同管理办法
- 2025年学历类自考专业(学前教育)学前特殊儿童教育-儿童发展理论参考题库含答案解析(5套)
- 2025年学历类自考专业(学前教育)学前教育研究方法-学前心理学参考题库含答案解析(5套)
- 《安全管理体系》课件
- 树立正确的人生价值观课件
- 防腐保温工程监理实施细则
- 法律事务所信息安全管理制度
- DB33T1373-2024农村电影放映服务规范
- 肿瘤患者的康复与护理
- 学生矫治教育申请书
- 防范工贸行业典型事故三十条措施解读
- 消防救援大队专职消防员政审表
- 幼儿园食谱营养计算表
- 2024年新人教版七年级上册生物全册教学课件(新版教材)
评论
0/150
提交评论