(1)MFC调用DLL基本步骤

合集下载

win32 dll和mfc dll

win32 dll和mfc dll

现在最常看见的关于DLL的问题就是如何在DLL中使用对话框,这是一个很普遍的关于如何在DLL中使用资源的问题。

这里我们从Win32 DLL和MFC DLL两个方面来分析并解决这个问题。

1.Win32 DLL在Win32 DLL中使用对话框很简单,你只需要在你的DLL中添加对话框资源,而且可以在对话框上面设置你所需要的控件。

然后使用DialogBox或者CreateDialog这两个函数(或相同作用的其它函数)来创建对话框,并定义你自己的对话框回调函数处理对话框收到的消息。

下面通过一个具体实例来学习如何在Win32 DLL中使用对话框,可以按照以下步骤来完成这个例子:1)在VC菜单中File->New新建一个命名为UseDlg的Win32 Dynamic-Link Library工程,下一步选择A simple DLL project。

2)在VC菜单中Insert->Resource添加一个ID为IDD_DLG_SHOW的Dialog资源,将此Dialog上的Cancel 按钮去掉,仅保留OK按钮。

再添加一个ID为IDD_ABOUTBOX的对话框,其Caption为About。

保存此资源,将资源文件命名为UseDlg.rc。

并将resource.h和UseDlg.rc加入到工程里面。

3)在UseDlg.app中包含resource.h,并添加如下代码:HINSTANCE hinst = NULL;HWND hwndDLG = NULL;BOOL CALLBACK DlgProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);BOOL CALLBACK AboutProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam);extern "C" __declspec(dllexport) void ShowDlg();BOOL APIENTRY DllMain( HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved){switch(ul_reason_for_call){case DLL_PROCESS_ATTACH:hinst = (HINSTANCE)hModule;case DLL_PROCESS_DETACH:break;}return TRUE;}extern "C" __declspec(dllexport) void ShowDlg(){hwndDLG = CreateDialog(hinst,MAKEINTRESOURCE(IDD_DLG_SHOW), NULL,(DLGPROC)DlgProc);ShowWindow(hwndDLG, SW_SHOW);}BOOL CALLBACK DlgProc(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam){switch(message){case WM_INITDIALOG:return TRUE;case WM_COMMAND:if(LOWORD(wParam)==IDOK)DialogBox(hinst,MAKEINTRESOURCE(IDD_ABOUTBOX),hDlg,(DLGPROC)AboutProc);return TRUE;case WM_CLOSE:DestroyWindow(hDlg);hwndDLG = NULL;return TRUE;}return FALSE;}BOOL CALLBACK AboutProc(HWND hDlg, UINT message,WPARAM wParam, LPARAM lParam){switch(message){case WM_CLOSE:EndDialog(hDlg,NULL);hwndDLG = NULL;return TRUE;}return FALSE;}4)编译生成UseDlg.dll和UseDlg.lib。

C_中如何调用动态链接库DLL

C_中如何调用动态链接库DLL

C#中如何调用动态链接库DLL编程技术2009-08-06 08:58:48 阅读863 评论0 字号:大中小动态链接库(也称为DLL,即为“Dynamic Link Library”的缩写)是Microsoft Windows最重要的组成要素之一,打开Windows系统文件夹,你会发现文件夹中有很多DLL文件,Windows就是将一些主要的系统功能以DLL模块的形式实现。

动态链接库是不能直接执行的,也不能接收消息,它只是一个独立的文件,其中包含能被程序或其它DLL调用来完成一定操作的函数(方法。

注:C#中一般称为“方法”),但这些函数不是执行程序本身的一部分,而是根据进程的需要按需载入,此时才能发挥作用。

DLL只有在应用程序需要时才被系统加载到进程的虚拟空间中,成为调用进程的一部分,此时该DLL也只能被该进程的线程访问,它的句柄可以被调用进程所使用,而调用进程的句柄也可以被该DLL所使用。

在内存中,一个DLL只有一个实例,且它的编制与具体的编程语言和编译器都没有关系,所以可以通过DLL来实现混合语言编程。

DLL函数中的代码所创建的任何对象(包括变量)都归调用它的线程或进程所有。

下面列出了当程序使用DLL 时提供的一些优点:[1]1) 使用较少的资源当多个程序使用同一个函数库时,DLL 可以减少在磁盘和物理内存中加载的代码的重复量。

这不仅可以大大影响在前台运行的程序,而且可以大大影响其他在Windows 操作系统上运行的程序。

2) 推广模块式体系结构DLL 有助于促进模块式程序的开发。

这可以帮助您开发要求提供多个语言版本的大型程序或要求具有模块式体系结构的程序。

模块式程序的一个示例是具有多个可以在运行时动态加载的模块的计帐程序。

3) 简化部署和安装当DLL 中的函数需要更新或修复时,部署和安装DLL 不要求重新建立程序与该DLL 的链接。

此外,如果多个程序使用同一个DLL,那么多个程序都将从该更新或修复中获益。

MFC下DLL编程(图解)

MFC下DLL编程(图解)

MFC 下DLL 编程(图解)DLL (Dynamic Link Library ,动态链接库)是微软公司为Windows 和OS/2操作系统设计一种供应用程序在运行时调用的共享函数库。

DLL 是应用程序的一种扩展,也是软件共享和重用的传统方法。

DLL 除了可同时被多个应用程序共享外,还可以在不改变调用接口(从而不需修改使用它的应用程序)的情况下,改进和升级里面的库函数。

而且DLL 与编写它的语言无关,例如,用VC 生成的规则DLL ,可以被VB 、Delphi 等生成的应用程序使用。

DLL 可以用多种语言和工具编写,我们这里只介绍如何使用MFC 来编写和使用DLL 。

相关说明文档位于MSDN 帮助的“目录\开发工具和语言\Visual Studio\Visual C++\常见编程方法\DLL\”中。

8.1 基础本节先讨论DLL 与静态库的区别,然后列出几种适合放置DLL 的目录,最后介绍MFC DLL 的三种类型。

8.1.1 DLL 与静态链接库静态链接库Lib (Static Link Library ),是在编译的链接阶段将库函数嵌入到应用程序的内部。

如果系统中运行的多个应用程序都包含所用到的公共库函数,则必然造成很大的浪费。

这样即增加了链接器的负担,也增大了可执行程序的大小,还加大了内存的消耗。

Lib 的好处是应用程序可以独立运行,而不需要在操作系统中另外安装对应的DLL 。

而DLL 采用动态链接,对公用的库函数,系统只有一个拷贝(一般是位于系统目录的*.DLL 文件),而且只有在应用程序真正调用时,才加载到内存。

在内存中的库函数,也只有一个拷贝,可供所有运行的程序调用。

当再也没有程序需要调用它时,系统会自动将其卸载,并释放其所占用的内存空间。

参见图8-1。

图8-1 静态库函数与动态链接库的区别DLL 的缺点是应用程序不能独立运行,需要在操作系统中另外安装对应的DLL 。

例如,如果你的MFC 项目被设置成“在共享DLL 中使用MFC ”的,则虽然生成的可执行程序很使用静态库函数使用动态链接库小,但是在其他没有安装Visual C++(运行环境)的机器上是不能直接运行的,需要另外安装MFC的动态链接库(如mfc90.dll)。

mfc使用手册

mfc使用手册

mfc使用手册MFC(Microsoft Foundation Class Library)是微软提供的一个类库,用于简化Windows应用程序的开发过程。

以下是MFC使用手册的简要介绍:1. 简介:MFC是一个基于C++的类库,它提供了许多用于构建Windows应用程序的类和函数。

通过使用MFC,开发人员可以快速地构建具有一致外观和感觉的应用程序,并利用Windows平台提供的各种功能。

2. 安装和配置:在开始使用MFC之前,您需要安装Microsoft Visual Studio并确保安装了MFC开发工作负载。

安装完成后,您需要创建一个新的MFC项目或打开一个现有的MFC项目。

3. 创建MFC应用程序:要创建一个新的MFC应用程序,您需要使用Microsoft Visual Studio的向导。

选择“File”菜单中的“New”选项,然后选择“Project”。

在弹出的对话框中,选择“MFC Application”并按照向导的提示完成应用程序的创建过程。

4. MFC类库:MFC提供了许多用于构建应用程序的类和函数。

以下是一些常用的MFC类:CWinApp:应用程序对象类,用于管理应用程序级别的操作,例如初始化应用程序和退出应用程序。

CWnd:窗口类,用于管理窗口的各种操作,例如创建窗口、处理消息和绘制窗口。

CDocument:文档类,用于管理应用程序中的文档数据。

CView:视图类,用于管理应用程序中的视图,例如显示文档数据和与用户交互。

5. MFC消息处理:MFC使用消息传递机制来处理用户与应用程序的交互。

每个窗口和控件都处理一组预定义的消息,例如鼠标点击、键盘输入和窗口大小改变等。

通过覆盖类中的虚函数,您可以定义应用程序如何响应这些消息。

6. MFC对话框和控件:MFC提供了许多内置的对话框和控件,例如按钮、文本框和列表框等。

您可以使用对话框编辑器来创建对话框,并将控件拖放到对话框中。

MFC调用IDL

MFC调用IDL

经过一晚上的努力终于解决了在VS2008下VC++ 调用IDL的所有的问题。

环境:VS2008下的VC++ENVI4.7下的IDL7.1第一步:打开一个MFC的MFC的应用程序,并添加一个按钮,工程名为:hello1第二步:设置VS2008如:项目->hello1属性->配置属性->链接器->输入在对话框的附加依赖项:填写idl.lib第三步:在C:\Program Files (x86)\ITT\IDL71\external\include找到idl_export.h,把他放在hello1的工程文件里面,和其他.h文件放在一块第四步:在MFC的Button1的单击事件中,写入代码如下:HANDLE hInstance=AfxGetInstanceHandle();IDL_Win32Init(0,hInstance,NULL,0);IDL_ExecuteStr(".compile 'C:\Users\acer\Desktop\d_map.pro'");IDL_ExecuteStr("d_map");IDL_Cleanup(TRUE);注意:d_map.pro 文件放在C:\Users\acer\Desktop如果是想编译XX.sav文件,格式如:IDL_ExecuteStr(".restore, 'C:\Users\acer\Desktop\XX.sav'");其他代码不变还用一个注意事项是:添加idl_export.h头文件如:运行截图:不过在开始碰到很多系统问题如:我的系统是win7系统,开始新建MFC总是报错:mfc90ud.dll丢失,最后解决了是路径问题,解决方法是:“工具”—>“选项”—>“项目和解决方案”—>“VC++目录”,在可执行文件栏中加入下面的路径:$(SystemRoot)\System32$(SystemRoot)$(SystemRoot)\System32\wbem。

MFC调用DLL操作数据库并显示结果集

MFC调用DLL操作数据库并显示结果集

功能说明:可打开一个数据库,获取其中任何一个表格的内容,DLL生成的工程和调用的工程在同一工作空间,DLL库中的函数调用声明是__stdcall方式,用.def文件导出函数。

一、用MFC中的CListCtrl控件创建一个列表1、创建一个MFC工程新建(New)——工程(Project)——MFC AppWizard(exe)——填好工程名(Project Name)——确定(OK)——选择基本对话框(Dialog)——完成(Finish)2、添加列表控件(CListCtrl)在工作区打开ResourceView界面在Dialog文件夹中找到建立的窗口,在控件工具栏里面选择列表控件拖入到窗口中,用鼠标拖拽的方式设定合适的大小(如果没有控件工具栏,右击窗口工具栏,在弹出的列表中点击选中控件即可)。

3、关联对象变量点击选中新添加的列表控件,点击菜单栏中的查看,选中建立类向导,在弹出的窗口中选择Member Variables选项卡,在Contrls IDs:列中招列表控件对应的ID(查看ID 可右击列表控件,选择属性即可)并双击(或者点击选中后再点击窗口左边的Add Variable 按钮),在弹出的窗口中设置对象的名字及类型。

4、设置列表控件的风格在OnInitDialog()中添加下面的代码:LONG lStyle;lStyle = GetWindowLong(m_List.m_hWnd, GWL_STYLE); //获取当前窗口stylelStyle &= ~LVS_TYPEMASK; //清除显示方式位lStyle |= LVS_REPORT; //设置styleSetWindowLong(m_List.m_hWnd, GWL_STYLE, lStyle); //设置styleDWORD dwStyle = m_List.GetExtendedStyle();dwStyle |= LVS_EX_FULLROWSELECT; //选中某行使整行高亮(只适用与report 风格的listctrl)dwStyle |= LVS_EX_GRIDLINES; //网格线(只适用与report风格的listctrl) dwStyle |= LVS_EX_CHECKBOXES; //item前生成checkbox控件m_List.SetExtendedStyle(dwStyle); //设置扩展风格二、创建生成DLL文件的工程1、添加一个新的工程到当前工作空间中工程——增加到工程——新建——工程选项卡——Win32 Console Application ——填好工程名——选择添加到当前工作空间——确定2、在DLL工程中添加.cpp文件,首先导入ADO动态链接库msado15.dll代码如下:#import "c:Program Files\Common Files\System\ado\msado15.dll"no_namespace rename("EOF","adoEOF")定义三个主要的操作对象:_ConnectionPtr m_pConnect; //定义链接对象_RecordsetPtr m_pRecord; //定义记录集对象_CommandPtr m_pCommand; //定义命令对象编辑相关的函数,初始化COM和链接数据库函数、获取记录集函数等,如://初始化COM库和链接数据库_ConnectionPtr& __stdcall OnInitADOConn(_bstr_t strConnect){::CoInitialize(NULL);try{//对象实例化m_pConnect.CreateInstance(__uuidof(Connection));m_pConnect->Open(strConnect,"","",adModeUnknown); //建立链接//MessageBox(NULL,"链接成功!","提示",0);}catch(_com_error e){MessageBox(NULL,e.Description(),"error",0);}return m_pConnect;}//获取记录集_RecordsetPtr& __stdcall GetRecordSet(_bstr_t bstrSQL,_bstr_t strConnect){try{// 连接数据库,如果Connection对象为空,则重新连接数据库if(m_pConnect == NULL)OnInitADOConn(strConnect);//对象实例化m_pRecord.CreateInstance(__uuidof(Recordset));m_pRecord->Open(bstrSQL,m_pConnect.GetInterfacePtr(),adOpenDynamic,ad LockOptimistic,adCmdText);//MessageBox(NULL,"成功获取记录集!","提示",0);}catch(_com_error e){MessageBox(NULL,e.Description(),"error",0);}return m_pRecord;}//执行命令对象_RecordsetPtr& __stdcall ExeCommand(_bstr_t bstrSQL,_bstr_t strConnect){try{// 连接数据库,如果Connection对象为空,则重新连接数据库if(m_pConnect == NULL)OnInitADOConn(strConnect);m_pCommand.CreateInstance(__uuidof(Command));m_pCommand->put_ActiveConnection((_variant_t)((IDispatch*)m_pConnect));m_pCommand->CommandText = bstrSQL;m_pRecord = m_pCommand->Execute(NULL,NULL,adCmdText);//MessageBox(NULL,"成功执行命令对象!","提示",0);}catch(_com_error e){MessageBox(NULL,e.Description(),"error",0);}return m_pRecord;}//执行SQL语句BOOL __stdcall ExecuteSQL(_bstr_t bstrSQL,_bstr_t strConnect) {try{// 是否已经连接数据库if(m_pConnect == NULL)OnInitADOConn(strConnect);m_pConnect->Execute(bstrSQL,NULL,adCmdText);//MessageBox(NULL,"执行SQL语句成功!","提示",0);return true;}catch(_com_error e){MessageBox(NULL,e.Description(),"error",0);return false;}}//断开链接void __stdcall ExitConnect(){try{if(m_pRecord != NULL){m_pRecord->Close();m_pRecord = NULL;}if(m_pConnect != NULL){m_pConnect->Close();m_pConnect = NULL;}if(m_pCommand != NULL){m_pCommand = NULL;}//MessageBox(NULL,"成功断开链接!","提示",0);}catch(_com_error e){MessageBox(NULL,e.Description(),"error",0);return;}::CoUninitialize();}3、.def文件导出函数LIBRARY SqlDllNo_ClassEXPORT SOnInitADOConn //函数名GetRecordSet //函数名ExeCommand //函数名ExecuteSQL //函数名ExitConnect //函数名注释:当同一工作空间中有两个工程时,要编译哪个工程时可在组建工具栏中选择(组建工具栏可右击工具栏空白处在组建前面打钩,即可显示组建工具栏);如下图:三、调用DLL操作数据库1、在myDataListDlg.cpp前面定义全局变量,在myDataListDlg.h中添加#import "c:Program Files\Common Files\System\ado\msado15.dll" no_namespace rename("EOF","adoEOF")导入ADO动态链接库#ifdef _DEBUG#define new DEBUG_NEW#undef THIS_FILEstatic char THIS_FILE[] = __FILE__;#endif在上面这段代码的后面添加下面的代码HINSTANCE hDLL = NULL; //定义动态链接库句柄//给几个dll中的函数的指针取别名typedef void (__stdcall * lpConn)(_bstr_t strConnect);typedef _RecordsetPtr& (__stdcall* lpRec)(_bstr_t bstrSQL,_bstr_t strConnect); //__stdcall绝对不能少,否则会出错typedef _RecordsetPtr& (__stdcall* lpCmd)(_bstr_t bstrSQL,_bstr_t strConnect);typedef BOOL (__stdcall* lpExe)(_bstr_t bstrSQL,_bstr_t strConnect);typedef void (__stdcall* lpExit)();//定义几个dll中的函数指针lpConn OnInitADOConn = NULL;lpRec GetRecordSet = NULL;lpExe ExecuteSQL = NULL;lpExit ExitConnect = NULL;2、加载DLL,获取函数地址在OnInitDialog()函数中的// TODO: Add extra initialization here后面添加下列代码_RecordsetPtr m_pRecord;//_bstr_t strSQL = "insert into SuperCar values('Aston Martin',4.5,370,270)"; _bstr_t strSQL = "delete from SuperCar where CarName='Aston Martin'"; _bstr_t strConnect = "Driver={SQLServer};Server=10.0.0.44;Database=Car;UID=sa;PWD=111111";hDLL = LoadLibrary("SqlDllNo_Class.dll");if(hDLL != NULL){MessageBox("加载SqlDllNo_Class.dll成功");OnInitADOConn = (lpConn)GetProcAddress(hDLL,"OnInitADOConn"); if(OnInitADOConn != NULL){// 初始化COM库并连接数据库OnInitADOConn(strConnect);}ExecuteSQL = (lpExe)GetProcAddress(hDLL,"ExecuteSQL");if(ExecuteSQL != NULL){ExecuteSQL(strSQL,strConnect);}GetRecordSet = (lpRec)GetProcAddress(hDLL,"GetRecordSet");if(GetRecordSet != NULL){//获取记录集_bstr_t strTempSQL = "select * from SuperCar";m_pRecord = GetRecordSet(strTempSQL,strConnect);}ExitConnect = (lpExit)GetProcAddress(hDLL,"ExitConnect");}3、获取数据库表格中的数据,添加到创建的列表中FieldsPtr fields; //定义一个列集对象FieldPtr field; //定义一个列对象m_pRecord->get_Fields (&fields); //将获取的记录集中的列集放到列集对象fields中long nColCount; //定义记录集中列数fields->get_Count(&nColCount); //将列集中的列的个数放到nColCount 中。

C#下开发及调用dll文件的方法

C#下开发及调用dll文件的方法

C#下开发及调用dll文件的方法在.net中,可调用的dll(动态链接库)文件其实就是一个类库。

我们可以通过写一个类,然后把它编译成dll文件形式,在其他的项目中就可以直接调用此编译好的dll文件,而不用重复写这个类的代码。

下面详细介绍此过程:一、开发dll文件(1)打开vs2005,新建项目中模板选择“类库”(2)在解决资源管理器里面添加一文件夹“First”,在其中添加两个类MathAdd和MathMinus,在其父目录里直接添加一个名为yun(写这个类的时候,我已经晕了,不知道取什么名字好,于是就yun了)的类。

下面是各个类的代码,注意类前一定要加上public,不然这个类会被当做是私有的,不能够被引用,当初我就是犯了这个错误,弄个了好久才想起,真是追悔莫及啊。

类中的方法为静态或非静态都可以。

MathAdd类代码using System;using System.Collections.Generic;using System.Text;namespace noo.First{public class MathAdd{public int add( int a,int b){return a + b;}public static int Muti(int a, int b){int mutiSum;mutiSum = a * b;return mutiSum;}}}MathMinus类代码using System;using System.Collections.Generic;using System.Text;namespace noo.First{public class MathMinus{public static int minus(int a, int b){return a - b;}}}yun类代码using System;using System.Collections.Generic;using System.Text;namespace noo{public class yun{public int add(int a, int b,int c){return a + b-c;}}到此,dll代码其实已经写好,这里我们可以发现,其实dll文件就是一个一个封装好的类库而已。

(1)MFC调用DLL基本步骤

(1)MFC调用DLL基本步骤

MFC调用DLL基本步骤
2013-5-9
第一步:创建动态链接库
1、创建动态链接库工程
2、选择一个可以到处某些符号的DLL工程
3、添加Add加法函数。

打开Math.cpp文件,在文件最后输入函数代码
打开Math.h文件,在文件中加入函数声明语句,以方便外部调用Add函数
4、按F7或者Build按钮,此时将产生Math.dll和Math.lib文件,在Debug文件夹内,Math.h文件在Debug文件外
第二步在工程中使用DLL
1、在2DCAD中添加调用DLL的对话框并进行设置ID号
2、添加对话框类CTestDllDlg,并添加成员变量
3、将动态链接库文件复制到2DCAD目录下,有三个Math.dll、Math.lib、Math.h
4、给等号按钮添加消息处理
打开CTestDllDlg的OnButtonEqual函数,调用函数实现求和。

修改函数代码如下:
在TestDllDlg.cpp中包含动态链接库Math.dll的头文件Math.h:#include “Math.h”
5、将Math.lib加入到工程链接库
6、在2DCAD程序中弹出CTestDllDlg对话框
为2DCAD添加一个顶层菜单DLL和一个菜单项使用[Math.dll],修改菜单项ID为ID_DLL_MATH,并添加消息处理函数
修改函数如下:
在MainFrm.cpp中包含对话框类头文件:#include “TestDllDlg.h”
6、编译并运行2DCAD程序即可。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

MFC调用DLL基本步骤
2013-5-9
第一步:创建动态链接库
1、创建动态链接库工程
2、选择一个可以到处某些符号的DLL工程
3、添加Add加法函数。

打开Math.cpp文件,在文件最后输入函数代码
打开Math.h文件,在文件中加入函数声明语句,以方便外部调用Add函数
4、按F7或者Build按钮,此时将产生Math.dll和Math.lib文件,在Debug文件夹内,Math.h文件在Debug文件外
第二步在工程中使用DLL
1、在2DCAD中添加调用DLL的对话框并进行设置ID号
2、添加对话框类CTestDllDlg,并添加成员变量
3、将动态链接库文件复制到2DCAD目录下,有三个Math.dll、Math.lib、Math.h
4、给等号按钮添加消息处理
打开CTestDllDlg的OnButtonEqual函数,调用函数实现求和。

修改函数代码如下:
在TestDllDlg.cpp中包含动态链接库Math.dll的头文件Math.h:#include “Math.h”
5、将Math.lib加入到工程链接库
6、在2DCAD程序中弹出CTestDllDlg对话框
为2DCAD添加一个顶层菜单DLL和一个菜单项使用[Math.dll],修改菜单项ID为ID_DLL_MATH,并添加消息处理函数
修改函数如下:
在MainFrm.cpp中包含对话框类头文件:#include “TestDllDlg.h”
6、编译并运行2DCAD程序即可。

相关文档
最新文档