精华内容
下载资源
问答
  • Dll制作

    千次阅读 2012-07-19 07:35:55
    实现MFC扩展DLL中导出类和对话框 中国学生网 2006-03-03 07:30:11 作者:江上飞鸟 来源:vckbase    如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,...

    实现MFC扩展DLL中导出类和对话框

    中国学生网 2006-03-03 07:30:11 作者:江上飞鸟 来源:vckbase 

     

    如果要编写模块化的软件,就要对对动态链接库(DLL)有一定的了解,本人这段时间在修改以前的软件时,决定把重复用的类和对话框做到DLL中,下面就从一个简单的例子讲起,如何实现MFC扩展DLL中导出类和对话框。



      一、创建MFC扩展DLL

      步骤:

      运行Visual Studio 6.0->File->New...->Projects;

      选择Mfc AppWizard(dll),在右边Projectname下输入ExportClass,单击“下一步”;

      选择Mfc Extension DLL (using share MFC DLL) 单击“finish”;

      以上完成建立扩展DLL的框架,下面接着建立输出类:

      Insert-> New Class...在打开的对话框中,"Class Type" 选择"GenericClass",Class Name 中输入

      CDogClass(当然你可以用其它的名称,我喜欢小狗,所有用它了,在"Base Class"下输入CObject,然后"OK";

      为类添加两个测试用的变量 int m_nNum;CString m_sData;完全的类信息如下:

      DogClass.h头文件:

    class CDogClass : public CObject
    {
     private :
      int m_nNum;
      CString m_sData;
     public:
      int ShowDlg();
      void Init();
      CDogClass();
      virtual ~CDogClass();
      void SetNum(int num) { m_nNum = num;};
      int GetNum() { return m_nNum; };
      void SetData(CString data) { m_sData = data;};
      CString GetData() { return m_sData; };
    };

    DogClass.cpp实现文件:

    CDogClass::CDogClass()
    {
     Init();
    }

    CDogClass::~CDogClass()
    {}

    void CDogClass::Init()
    {
     m_nNum = 0;
     m_sData = "";
    }


      编辑DogClass.h头文件修改下面一行;class AFX_EXT_CLASS CDogClass : public CObject

      以上完成类的建立,下面建立输出对话框;Insert-> Resouce...新建立一个对话框,添加两个编辑框IDC_EDIT1,IDC_EDIT2,然后建立CDlgDog对话框类并为两编辑框添加int m_nNum和CString m_sData的变量。

      在DogClass.cpp的#include"DogClass.h"下加入#include "DlgDog.h"

      在DogClass类中添加int ShowDlg();函数用来调用对话框,并在int CDogClass::ShowDlg()中添加如下代码:

    CDlgDog dlg;
    dlg.m_nNum = GetNum();
    dlg.m_sData = GetData();
    if (IDOK==dlg.DoModal())
    {
     SetNum(dlg.m_nNum);
     SetData(dlg.m_sData);
     return 1;
    }
    return 0;


      然后编译Dll,会发现有几个错误,不用怕,好解决的,首先,去掉DlgDog.cpp中的 #include “\ add additionalincludes here”这一行;其次,在stdax.h中加入include "resource.h",再编译,OK。

      二、建立DLL 测试程序

      步骤:

      新建一个基于对话框的MFC应用程序,添加一按钮IDC_BUTTON1,并在按钮事件中添加如如下代码:

    void CTestExportClassDlg::OnButton1()
    {
     CDogClass dog;

     dog.Init();
     if (dog.ShowDlg()!=0)
     {
      CString str;
      str.Format("Num is: %d Data is: %s" dog.GetNum(), dog.GetData());
      AfxMessageBox(str);
     }
    }


      从ExportClass文件目录拷贝DogClass.h和ExportClass.lib文件到测试程序目录下;

      在TestExportClassDlg.cpp中加入#include“DogClass.h”行;往连接程序的导入库中添加ExportClass.lib,在VS的Project->Settings下的Setting For选择All Configuration.,然后在下面的页面Object/Library Conttrol中加入ExportClass.lib;

      别忘了把ExportClass.dll复制到系统目录或当前应用程序目录;然后编译就OK了。

     

     

    Visual C++ MFC DLL

    减小字体增大字体

    Visual C++ MFC DLL DLL 程。

    Windows Windows SDK Windows 境。 Visual C++ MFC Windows API 图。

    MFC 具,远。上, MFC 合, MFC 类。 C++ 力。 ( )分。

    MFC 合,享。呢? Visual C++ 库(Component Gallery件。 MFC DLL 展。 DLL 样, MFC DLL 类。 MFC DLL MFC DLL者,使 DLL 库。

     编 MFC DLL 吗? Visual C++ MFC 持,松。 MFC DLL MFC CToolTipCtrl 足。便性, MFC 展。

    MFC DLL

     从言, MFC CTool-TipCtrl 息(ToolTip程。 ( UI 口。 ) 决。 CToolTipCtrl::AddTool 类,制。类。

    CToolTipCtrl 志, ―― MFC 能。是,正。 CToolTipCtrl 类, CToolTipCtrl::AddTool 可, TTM_ADDTOOL 使 TOOLINFO 构, uFlags TTF_SUBCLASS 志。它:息。 AddTool 者,同。

    1 2 CToolTip-CtrlEx CToolTipCtrl 码。数, CToolTipCtrl::AddWindow 联, AddRectangle 使域。使 TTF_SUBCLASS 使单。 m_tooltipCtrl CToolTipCtrlEx 象, ID IDC_BUTTON 了:

    m_tooltipCtrl.AddWindow (

    GetDlgItem (IDC_BUTTON),

    "Enter tooltip text here!");

    CToolTipCtrlEx DLL 呢? Visual C++ 4.x 骤:

    1. Visual C++ File New 目, Project Workspace New Project Workspace Name “MfcExt”( ) Type MFC AppWizard(dll) Create 钮。

    2. AppWizard Step 1 中,“What type of DLL would you like to create?” “MFC Extension DLL(using shared MFC DLL)” Finish 钮, OK DLL 码。“MFC Extension DLL” “using shared MFC DLL” MFC DLL 时, MFC DLL MFC 库。

    3. ClassWizard Add Class 钮。 New Create New Class 框。“Base class” CToolTipCtrl“Name” “CToolTipCtrlEx”使 Change Tooltip.h Tooltip.cpp。(改的,名。)“Add to Component Gallery” 间。 Create ClassWizard 生, OK 退 ClassWizard

    4. 2 示, CToolTipCtrlEx AddWindow AddRectangle CToolTipCtrlEx 访问, public 的。巧: Visual C++ 便 ClassView 名, Add Function

    5. ClassView 中, CToolTipCtrlEx 件。 class AFX_EXT_CLASS(参 1)。

    6. 目。件: DLL 身(Mfcext.dll DLL 库(Mfcext.lib)。 ―― 者,类。使使 MFC DLL 类,样。 Mfcext.lib 使 Windows Mfcext.dll 行。

    使 MFC DLL

    使 Mfcext.dll 的。使 CToolTipCtrlEx Tooltip.h 件, Mfcext.lib 可。 CToolTipCtrlEx MFC 使了。 AppWizard “As a shared DLL” MFC Visual C++ Build Settings Mfcext.lib 中, Link “Object/library modules” Mfcext.lib 径(参 3)。

    ToolTest 序,钮。 Mfcext.dll 使 CToolTipCtrlEx的, dialog m_tooltipCtrl CToolTipCtrlEx 量。 OnInitDialog 息:

    m_tooltipCtrl.Creat (this);

    m_tooltipCtrl.AddWindowTool (

    GetDlgItem (IDC_EXIT),

    "Click here to close");

    时,“Click here to close”序。

    PC Magazine Onlinewww.pcmag.com ToolTest Mfcext.dll 码。 Downloads PC Tech Archives V16n15.zip CompuServe Utilities/Tips 坛(GO ZNT:TIPS件。中。使 PKUNZIP -d 件(Mfcext.zip Tooltest.zip),便 .ZIP 压。 ToolTest 前, Mfcext.dll Windows Tooltest.exe 录。则, ToolTest 时, Windows Mfcext.dll Tooltest.exe 本, Project Settings “Object/library modules” 名,使 Visual C++ PC Mfcext.lib 件。

    MFC DLL ―― 作。 MFC DLL 时, DLL .LIB DLL 身。了。

     

     

    VC++动态链接库编程之MFC扩展DLL


    来源:qqread   作者:新书城收集整理   发布时间:2006-12-23   人气:268

     

     

     

     

    前文我们对非MFC DLL和MFC规则DLL进行了介绍,现在开始详细分析DLL的最后一种类型――MFC扩展DLL。

    6.1概论

     

    MFC扩展DLL与MFC规则DLL的相同点在于在两种DLL的内部都可以使用MFC类库,其不同点在于MFC扩展DLL与应用程序的接口可以是MFC的。MFC扩展DLL的含义在于它是MFC的扩展,其主要功能是实现从现有MFC库类中派生出可重用的类。MFC扩展DLL使用MFC 动态链接库版本,因此只有用共享MFC 版本生成的MFC 可执行文件(应用程序或规则DLL)才能使用MFC扩展DLL。

    从前文可知,MFC规则DLL被MFC向导自动添加了一个CWinApp的对象,而MFC扩展DLL则不包含该对象,它只是被自动添加了DllMain 函数。对于MFC扩展DLL,开发人员必须在DLL的DllMain函数中添加初始化和结束代码。

    从下表我们可以看出三种DLL对DllMain入口函数的不同处理方式:

    对于MFC扩展DLL,系统会自动在工程中添加如下表所示的宏,这些宏为DLL和应用程序的编写提供了方便。像AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA这样的宏,在DLL和应用程序中将具有不同的定义,这取决于_AFXEXT宏是否被定义。这使得在DLL和应用程序中,使用统一的一个宏就可以表示出输出和输入的不同意思。在DLL中,表示输出(因为_AFXEXT被定义,通常是在编译器的标识参数中指定/D_AFXEXT);在应用程序中,则表示输入(_AFXEXT没有定义)。

    6.2 MFC扩展DLL导出MFC派生类

    在这个例子中,我们将产生一个名为“ExtDll”的MFC扩展DLL工程,在这个DLL中导出一个对话框类,这个对话框类派生自MFC类CDialog。

    使用MFC向导生成MFC扩展DLL时,系统会自动添加如下代码:

    static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };

    extern "C" int APIENTRY

    DllMain( HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved )

    {

    // Remove this if you use lpReserved

    UNREFERENCED_PARAMETER( lpReserved );

    //说明:lpReserved是一个被系统所保留的参数,对于隐式链接是一个非零值,对于显式链接值是零

    if (dwReason == DLL_PROCESS_ATTACH)

    {

    TRACE0( "EXTDLL.DLL Initializing!\n" );

    // Extension DLL one-time initialization

    if ( !AfxInitExtensionModule( ExtDllDLL, hInstance ))

    return 0;

    // Insert this DLL into the resource chain

    new CDynLinkLibrary( ExtDllDLL );

    }

    else if (dwReason == DLL_PROCESS_DETACH)

    {

    TRACE0( "EXTDLL.DLL Terminating!\n" );

    // Terminate the library before destructors are called

    AfxTermExtensionModule( ExtDllDLL );

    }

    return 1; // ok

    }

    这一段代码含义晦涩,我们需要对其进行解读:

    (1)上述代码完成MFC扩展DLL的初始化和终止处理;

    (2)初始化期间所创建的 CDynLinkLibrary 对象使MFC扩展 DLL 可以将 DLL中的CRuntimeClass 对象或资源导出到应用程序;

    (3)AfxInitExtensionModule函数捕获模块的CRuntimeClass 结构和在创建 CDynLinkLibrary 对象时使用的对象工厂(COleObjectFactory 对象);

    (4)AfxTermExtensionModule函数使 MFC 得以在每个进程与扩展 DLL 分离时(进程退出或使用AfxFreeLibrary卸载DLL时)清除扩展 DLL;

    (5)第一条语句static AFX_EXTENSION_MODULE ExtDllDLL = { NULL, NULL };定义了一个AFX_EXTENSION_MODULE类的静态全局对象,AFX_EXTENSION_MODULE的定义如下:

    struct AFX_EXTENSION_MODULE

    {

    BOOL bInitialized;

    HMODULE hModule;

    HMODULE hResource;

    CRuntimeClass* pFirstSharedClass;

    COleObjectFactory* pFirstSharedFactory;

    };

    由AFX_EXTENSION_MODULE的定义我们可以更好的理解(2)、(3)、(4)点。

    在资源编辑器中添加一个如图15所示的对话框,并使用MFC类向导为其添加一个对应的类CExtDialog,系统自动添加了ExtDialog.h和ExtDialog.cpp两个头文件。

    图15 MFC扩展DLL中的对话框

    修改ExtDialog.h中CExtDialog类的声明为:

    class AFX_EXT_CLASS CExtDialog : public CDialog

    {

    public:

    CExtDialog( CWnd* pParent = NULL );

    enum { IDD = IDD_DLL_DIALOG };

    protected:

    virtual void DoDataExchange( CDataExchange* pDX );

    DECLARE_MESSAGE_MAP()

    };

    这其中最主要的改变是我们在class AFX_EXT_CLASS CExtDialog语句中添加了“AFX_EXT_CLASS”宏,则使得DLL中的CExtDialog类被导出。

     

     

    VC++动态链接库编程之MFC扩展DLL


    来源:qqread   作者:新书城收集整理   发布时间:2006-12-23   人气:268

     

     

     

     

    6.3 MFC扩展DLL的加载

    6.3.1 隐式加载

    我们在6.2工程所在的工作区中添加一个LoadExtDllDlg工程,用于演示MFC扩展DLL的加载。在LoadExtDllDlg工程中添加一个如图16所示的对话框,这个对话框上包括一个“调用DLL”按钮。

    图16 MFC扩展DLL调用工程中的对话框

    在与图16对应对话框类实现文件的头部添加:

    // LoadExtDllDlg.cpp : implementation file

    //

    #include "..\ExtDialog.h"

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

    而“调用DLL”按钮的单击事件的消息处理函数为:

    void CLoadExtDllDlg::OnDllcallButton()

    {

    CExtDialog extDialog;

    extDialog.DoModal();

    }

    当我们单击“调用DLL”的时候,弹出了如图15的对话框。

    为提供给用户隐式加载(MFC扩展DLL一般使用隐式加载,具体原因见下节),MFC扩展DLL需要提供三个文件:

    (1)描述DLL中扩展类的头文件;

    (2)与动态链接库对应的.LIB文件;

    (3)动态链接库.DLL文件本身。

    有了这三个文件,应用程序的开发者才可充分利用MFC扩展DLL。

    6.3.2 显示加载

    显示加载MFC扩展DLL应使用MFC全局函数AfxLoadLibrary而不是WIN32 API中的LoadLibrary。AfxLoadLibrary 最终也调用了 LoadLibrary这个API,但是在调用之前进行了线程同步的处理。

    AfxLoadLibrary 的函数原型与 LoadLibrary完全相同,为:

    HINSTANCE AFXAPI AfxLoadLibrary( LPCTSTR lpszModuleName );

    与之相对应的是,MFC 应用程序应使用AfxFreeLibrary 而非FreeLibrary 卸载MFC扩展DLL。AfxFreeLibrary的函数原型也与 FreeLibrary完全相同,为:

    BOOL AFXAPI AfxFreeLibrary( HINSTANCE hInstLib );

    如果我们把上例中的“调用DLL”按钮单击事件的消息处理函数改为:

    void CLoadExtDllDlg::OnDllcallButton()

    {

    HINSTANCE hDll = AfxLoadLibrary( "ExtDll.dll" );

    if(NULL == hDll)

    {

    AfxMessageBox( "MFC扩展DLL动态加载失败" );

    return;

    }

    CExtDialog extDialog;

    extDialog.DoModal();

    AfxFreeLibrary(hDll);

    }

    则工程会出现link错误:

    LoadExtDllDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: virtual __thiscall CExtDialog::~CExtDialog(void)" (__imp_??1CExtDialogUAE@XZ)

    LoadExtDllDlg.obj : error LNK2001: unresolved external symbol "__declspec(dllimport) public: __thiscall CExtDialog::CExtDialog(class CWnd *)" (__imp_??0CExtDialogQAE@PAVCWnd@Z)

    提示CExtDialog的构造函数和析构函数均无法找到!是的,对于派生MFC类的MFC扩展DLL,当我们要在应用程序中使用DLL中定义的派生类时,我们不宜使用动态加载DLL的方法。

    6.4 MFC扩展DLL加载MFC扩展DLL

    我们可以在MFC扩展DLL中再次使用MFC扩展DLL,但是,由于在两个DLL中对于AFX_EXT_CLASS、AFX_EXT_API、AFX_EXT_DATA宏的定义都是输出,这会导致调用的时候出现问题。

    我们将会在调用MFC扩展DLL的DLL中看到link错误:

    error LNK2001: unresolved external symbol ….......

    因此,在调用MFC扩展DLL的MFC扩展DLL中,在包含被调用DLL的头文件之前,需要临时重新定义AFX_EXT_CLASS的值。下面的例子显示了如何实现:

    //临时改变宏的含义“输出”为“输入”

    #undef AFX_EXT_CLASS

    #undef AFX_EXT_API

    #undef AFX_EXT_DATA

    #define AFX_EXT_CLASS AFX_CLASS_IMPORT

    #define AFX_EXT_API AFX_API_IMPORT

    #define AFX_EXT_DATA AFX_DATA_IMPORT

    //包含被调用MFC扩展DLL的头文件

    #include "CalledDLL.h"

    //恢复宏的含义为输出

    #undef AFX_EXT_CLASS

    #undef AFX_EXT_API

    #undef AFX_EXT_DATA

    #define AFX_EXT_CLASS AFX_CLASS_EXPORT

    #define AFX_EXT_API AFX_API_EXPORT

    #define AFX_EXT_DATA AFX_DATA_EXPORT

    VC++动态链接库编程之MFC扩展DLL


    来源:qqread   作者:新书城收集整理   发布时间:2006-12-23   人气:269

     

     

     

     

    6.5 MFC扩展DLL导出函数和变量

    MFC扩展DLL导出函数和变量的方法也十分简单,下面我们给出一个简单的例子。

    我们在MFC向导生成的MFC扩展DLL工程中添加gobal.h和global.cpp两个文件:

     

    //global.h:MFC扩展DLL导出变量和函数的声明

    extern "C"

    {

    int AFX_EXT_DATA total; //导出变量

    int AFX_EXT_API add( int x, int y ); //导出函数

    }

    //global.cpp:MFC扩展DLL导出变量和函数定义

    #include "StdAfx.h"

    #include "global.h"

    extern "C" int total;

    int add(int x,int y)

    {

    total = x + y;

    return total;

    }

    编写一个简单的控制台程序来调用这个MFC扩展DLL:

    #include <iostream.h>

    #include <afxver_.h>

    //AFX_EXT_DATA、AFX_EXT_API宏的定义在afxver_.h头文件中

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

    #include "..\global.h"

    int main(int argc, char* argv[])

    {

    cout << add(2,3) << endl;

    cout << total;

    return 0;

    }

    运行程序,在控制台上看到:

    5

    5

    另外,在Visual C++下建立MFC扩展DLL时,MFC DLL向导会自动生成.def文件。因此,对于函数和变量,我们除了可以利用AFX_EXT_DATA、AFX_EXT_API宏导出以外,在.def文件中定义导出也是一个很好的办法。与之相比,在.def文件中导出类却较麻烦。通常需要从工程生成的.map文件中获得类的所有成员函数被C++编译器更改过的标识符,并且在.def文件中导出这些“奇怪”的标识符。因此,MFC扩展DLL通常以AFX_EXT_CLASS宏直接声明导出类。

    6.6 MFC扩展DLL的应用

    上述各小节所举MFC扩展DLL的例子均只是为了说明某方面的问题,没有真实地体现“MFC扩展” 的内涵,譬如6.2派生自CDialog的类也不具备比CDialog更强的功能。MFC扩展DLL的真实内涵体现在它提供的类虽然派生自MFC类,但是提供了比MFC类更强大的功能、更丰富的接口。下面我们来看一个具体的例子(单击此处下载本工程)。

    我们知道static控件所对应的CStatic类不具备设置背景和文本颜色的接口,这使得我们不能在对话框或其它用户界面上自由灵活地修改static控件的颜色风格,因此我们需要一个提供了SetBackColor和SetTextColor接口的CStatic派生类CMultiColorStatic。

    这个类的声明如下:

    class AFX_EXT_CLASS CMultiColorStatic : public CStatic

    {

    // Construction

    public:

    CMultiColorStatic();

    virtual ~CMultiColorStatic();

    // Attributes

    protected:

    CString m_strCaption;

    COLORREF m_BackColor;

    COLORREF m_TextColor;

    // Operations

    public:

    void SetTextColor( COLORREF TextColor );

    void SetBackColor( COLORREF BackColor );

    void SetCaption( CString strCaption );

    // Generated message map functions

    protected:

    afx_msg void OnPaint();

    DECLARE_MESSAGE_MAP()

    };

    在这个类的实现文件中,我们需要为它提供WM_PAINT消息的处理函数(这是因为颜色的设置依赖于WM_PAINT消息):

    BEGIN_MESSAGE_MAP(CMultiColorStatic, CStatic)

    //{{AFX_MSG_MAP(CMultiColorStatic)

    ON_WM_PAINT() //为这个类定义WM_PAINT消息处理函数

    //}}AFX_MSG_MAP

    END_MESSAGE_MAP()

    下面是这个类中的重要成员函数:

    //为CMultiColorStatic类添加“设置文本颜色”接口

    void CMultiColorStatic::SetTextColor( COLORREF TextColor )

    {

    m_TextColor = TextColor; //设置文字颜色

    }

    //为CMultiColorStatic类添加“设置背景颜色”接口

    void CMultiColorStatic::SetBackColor( COLORREF BackColor )

    {

    m_BackColor = BackColor; //设置背景颜色

    }

    //为CMultiColorStatic类添加“设置标题”接口

    void CMultiColorStatic::SetCaption( CString strCaption )

    {

    m_strCaption = strCaption;

    }

    //重画Static,颜色和标题的设置都依赖于这个函数

    void CMultiColorStatic::OnPaint()

    {

    CPaintDC dc(this); // device context for painting

    CRect rect;

    GetClientRect( &rect );

    dc.SetBkColor( m_BackColor );

    dc.SetBkMode( TRANSPARENT );

    CFont *pFont = GetParent()->GetFont();//得到父窗体的字体

    CFont *pOldFont;

    pOldFont = dc.SelectObject( pFont );//选用父窗体的字体

    dc.SetTextColor( m_TextColor );//设置文本颜色

    dc.DrawText( m_strCaption, &rect, DT_CENTER );//文本在Static中央

    dc.SelectObject( pOldFont );

    }

    为了验证CMultiColorStatic类,我们制作一个基于对话框的应用程序,它包含一个如图17所示的对话框。该对话框上包括一个static控件和三个按钮,这三个按钮可分别把static控件设置为“红色”、“蓝色”和“绿色”。

    图17 扩展的CStatic类调用演示

    下面看看应如何编写与这个对话框对应的类。

    包含这种Static的对话框类的声明如下:

    #include "..\MultiColorStatic.h"

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

    // CCallDllDlg dialog

    class CCallDllDlg : public CDialog

    {

    public:

    CCallDllDlg(CWnd* pParent = NULL); // standard constructor

    enum { IDD = IDD_CALLDLL_DIALOG };

    CMultiColorStatic m_colorstatic; //包含一个CMultiColorStatic的实例

    protected:

    virtual void DoDataExchange(CDataExchange* pDX);//DDX/DDV support

    HICON m_hIcon;

    // Generated message map functions

    //{{AFX_MSG(CCallDllDlg)

    virtual BOOL OnInitDialog();

    afx_msg void OnSysCommand(UINT nID, LPARAM lParam);

    afx_msg void OnPaint();

    afx_msg HCURSOR OnQueryDragIcon();

    afx_msg void OnRedButton();

    afx_msg void OnBlueButton();

    afx_msg void OnGreenButton();

    //}}AFX_MSG

    DECLARE_MESSAGE_MAP()

    };

    下面是这个类中与使用CMultiColorStatic相关的主要成员函数:

    void CCallDllDlg::DoDataExchange(CDataExchange* pDX)

    {

    CDialog::DoDataExchange(pDX);

    //{{AFX_DATA_MAP(CCallDllDlg)

    DDX_Control(pDX, IDC_COLOR_STATIC, m_colorstatic);

    //使m_colorstatic与IDC_COLOR_STATIC控件关联

    //}}AFX_DATA_MAP

    }

    BOOL CCallDllDlg::OnInitDialog()

    {

    // TODO: Add extra initialization here

    // 初始static控件的显示

    m_colorstatic.SetCaption("最开始为黑色");

    m_colorstatic.SetTextColor(RGB(0,0,0));

    return TRUE; // return TRUE unless you set the focus to a control

    }

    //设置static控件文本颜色为红色

    void CCallDllDlg::OnRedButton()

    {

    m_colorstatic.SetCaption( "改变为红色" );

    m_colorstatic.SetTextColor( RGB( 255, 0, 0 ) );

    Invalidate( TRUE ); //导致发出WM_PAINT消息

    }

    //设置static控件文本颜色为蓝色

    void CCallDllDlg::OnBlueButton()

    {

    m_colorstatic.SetCaption( "改变为蓝色" );

    m_colorstatic.SetTextColor( RGB( 0, 0, 255 ) );

    Invalidate( TRUE ); //导致发出WM_PAINT消息

    }

    //设置static控件文本颜色为绿色

    void CCallDllDlg::OnGreenButton()

    {

    m_colorstatic.SetCaption( "改变为绿色" );

    m_colorstatic.SetTextColor( RGB(0,255,0) );

    Invalidate( TRUE ); //导致发出WM_PAINT消息

    }

    至此,我们已经讲解完成了所有类型的动态链接库,即非MFC DLL、MFC规则DLL和MFC扩展DLL。下一节将给出DLL的三个工程实例,与读者朋友们共同体会DLL的应用范围和使用方法。

     

    展开全文
  • DLL制作指南

    2017-10-06 19:46:20
    DLL 制作指南 待写
               DLL 制作指南 待写
    展开全文
  • DLL制作介绍

    2011-11-20 14:39:32
    DLL制作介绍 静态库lib 动态库dll 静态加载 动态加载 mfc动态库 mfc扩展动态库
  • WINDOWS.dll制作

    2015-08-06 08:50:35
    应用于WINDOWS.DLL制作,可以实现简单的加法功能
  • c#利用libvlc.dll制作播放器,写的比较急,估计有些错误。可以能用。c#利用libvlc.dll制作播放器,写的比较急,估计有些错误。可以能用。c#利用libvlc.dll制作播放器,写的比较急,估计有些错误。可以能用。c#利用...
  • DLL制作和调用

    2020-10-05 09:18:19
    DLL制作和调用 一、DLL简介 DLL,即动态链接库,它允许程序共享执行特殊任务所必需的代码和其他资源,是一种中间件。 使用DLL优点有如下几个方面: (1)多个应用程序共享代码和数据。 (2)节省内存和减少交换操作...

    DLL制作和调用

    一、DLL简介
    DLL,即动态链接库,它允许程序共享执行特殊任务所必需的代码和其他资源,是一种中间件。
    使用DLL优点有如下几个方面:
    (1)多个应用程序共享代码和数据。
    (2)节省内存和减少交换操作。
    (3)支持多语言程序。
    (4)在钩子程序过滤系统消息时必须使用DLL。
    (5)DLL以一种自然的方式将一个大的应用程序划分为几个小的模块,有利于小组内部成员的分工与合作。而且,各个模块可以独立升级。
    (6)实现应用程序的国际化。

    二、 用VS做一个DLL文件
    1、打开Visual Studio 2019(当然也可以选择其他版本),点击“创建新项目(N)”,如下图所示。
    在这里插入图片描述
    2、选择“类库(.NET Standard)”,就可以制作DLL文件。点击“下一步(N)”,如下图所示。
    在这里插入图片描述
    3、配置新项目。我这里的项目名称是“ShiYan15”,位置可自行设置,点击“创建(C)”,如下图所示。
    在这里插入图片描述
    4、写一个最简单的函数,它的返回类型是string型,随便给一个参数,比如aaa,它的返回值是“学号+姓名”。这样,DLL的制作就完成了。
    在这里插入图片描述
    5、选择“生成(B)”,点击“生成解决方案(B)”,再去所对应的文件夹里,发现生成了ShiYan15.dll文件,如下图所示。
    在这里插入图片描述
    6、下面的问题是如何去调用它。需要再新建一个项目,选择“Windows窗体应用”,点击“下一步(N)”,如下图所示。
    在这里插入图片描述
    7、配置新项目。项目名称可以用默认的,位置可自行设置,点击“创建(C)”,如下图所示。
    在这里插入图片描述
    8、在“工具箱”里拖动一个“Button”,添加Button按钮,更改其属性,比如重命名为“调用DLL”,如下图所示。
    在这里插入图片描述
    9、选择“生成(B)”,点击“生成解决方案(B)”,再去所对应的文件夹里,发现生成了后缀名是“.exe”的文件,如下图所示。
    在这里插入图片描述
    10、生成之后就是调用。要将dll文件调用到应用程序中来。采取的办法是:点击“项目(P)| 添加引用(R)…”,点击“浏览”,找到刚才的“ShiYan15.dll”文件,点击“添加”。如下图所示。
    在这里插入图片描述
    11、接下来就是通过代码来添加,用MessageBox调用输出。具体如下图所示。
    在这里插入图片描述
    12、点击“启动”,点击“调用DLL”,就会弹出内容,这样,本实验也就实现了DLL的制作和调用。如下图所示。
    在这里插入图片描述
    三、用VB做一个DLL文件

    1、打开VB6.0会出现如图所示的对话框,选择“ActiveX DLL”选项,然后单击对话框上的“打开”按钮。
    在这里插入图片描述
    2、进入主界面后,把工程名从默认的“工程1”改为“MyFirstDLL”;把类名从默认的“Class1”改为“CMath”。如下图所示。
    在这里插入图片描述
    3、开始写一个加法函数,如下图所示。
    在这里插入图片描述
    4、单击“文件”菜单,然后选择“MyFirstDLL.DLL”命令,把新生成的MyFirstDLL.DLL保存到相应的目录下。如下图所示。
    在这里插入图片描述
    对ActiveX DLL的测试

    (一)在VB上的测试
    1、打开VB6.0,在出现如下图所示的对话框时,选择“标准EXE”,然后单击“打开”按钮。在“工程”菜单里选择“引用”命令,然后在弹出的对话框中选择“浏览”选项,把刚生成的MyFirstDLL.DLL引用进来,单击“确定”按钮完成引用后就可以使用MyFirstDLL.DLL里面的CMath类了。
    在这里插入图片描述
    在这里插入图片描述
    2、在主界面上拖一个“按钮”,在这个“按钮”的单击事件里写如下的测试代码:
    (1)静态引用。

    Private Sub Command1_Click()        '静态引用
        Dim math As CMath
        Set math = New CMath
        MsgBox math.Add(10, 11)
    End Sub
    

    (2)动态引用

    Private Sub Command1_Click()        '动态引用
        Dim obj As Object
        Set obj = CreateObject("myfirstdll.cmath")
        MsgBox obj.Add(10, 11)
    End Sub
    

    3、运行测试程序,点击上面的按钮时,就会弹出一个提示框,显示的是程序运行的结果,如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    (二)在VC上的测试
    1、为了确保MyFirstDLL.DLL是已注册的控件,运行:regsvr32对这个ActiveX DLL进行注册,即使注册过了,再注册也没什么负面影响。
    注册成功后的截图如下图所示。
    在这里插入图片描述
    2、打开VC6.0,建立一个MFC对话框工程,如下图所示。
    在这里插入图片描述
    在这里插入图片描述
    3、在stdafx.h中加上对MyFirstDLL.DLL的导入,并引用这个命名空间MyFirstDLL,代码如下:
    #import “G:\高级软件工程(实验篇)\第15章 DLL制作和调用\用VB做DLL文件\MyFirstDLL.dll”
    using namespace MyFirstDLL;
    如下图所示。
    在这里插入图片描述
    4、双击“确定”按钮,重载“确定”按钮的响应函数,其代码如下:

    void CVCDlg::OnOK() 
    {
    	// TODO: Add extra validation here
    	HRESULT hResult;
    	CLSID clsid;
    	::CoInitialize(NULL);
    	hResult = CLSIDFromProgID(OLESTR("MyFirstDLL.CMath"),&clsid);
    	if (SUCCEEDED(hResult))
    	{
    		_CMath *pMath = NULL;
    		hResult = ::CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,_uuidof(_CMath),(LPVOID*)&pMath);
    		if (SUCCEEDED(hResult))
    		{
    			long a = 12;
    			long b = 13;
    			long lResult = pMath->Add(&a,&b);
    			CString str;
    			str.Format("%ld",lResult);
    			AfxMessageBox(str);
    		}
    	}
    	::CoUninitialize();
    	CDialog::OnOK();
    }
    

    在这里插入图片描述
    5、运行测试程序,得到的测试结果如下图所示。
    在这里插入图片描述
    至此,DLL在VS和VB上的制作和调用就完成了。

    展开全文
  • DLL制作及使用教程

    2014-04-27 16:25:35
    从网上收集整理的DLL制作及使用教程,非常有用
  • Delphi 案例Dll制作以及处理方法,导出dll和使用dll方式,数据库自定义函数的制作等等
  • VB6.0 DLL制作工具

    2013-10-09 12:08:05
    VB6.0 DLL制作工具 让VB6.0也可以方便的制作标准DLL,链接的文件不再是ActiveX DLL! 内有说明文件、图样、示例程序。 参与讨论,请到:http://bbs.csdn.net/topics/390609644 修改“资源”后就会无法显示?再试一次...
  • 标准dll制作本人精心收集的VB源码,绝对实用
  • VB6.0 DLL制作工具(修订版 Ver2.01),2015年7月7日修订。 让VB6.0也可以方便的制作“标准DLL”, 链接的文件不再是ActiveX DLL! 本次上传,为修正一个数据信息管理的错误(会造成DLL无法链接)。感谢 runhe2同学...
  • VB6.0_DLL制作工具(Ver1.3)

    热门讨论 2015-01-23 16:52:04
    VB6.0 DLL制作工具(修订版 Ver1.32) 让VB6.0也可以方便的制作“标准DLL”, 链接的文件不再是ActiveX DLL! 参与讨论,请到论坛这个贴子: http://bbs.csdn.net/topics/390976419
  • VB6.0 DLL制作工具(修订版 Ver1.33),2015年3月23日修订。 让VB6.0也可以方便的制作“标准DLL”, 链接的文件不再是ActiveX DLL! 本次上传,为修正一个参数解析中的错误(会造成DLL文件链接失败)。 参与讨论,请...
  • 关于MFC中类的dll制作及调用 在vs2010新建项目中创建mfcdll,选择带静态链接MFC的规则; 首先是你创建的dll项目的头文件 #ifndef Algorm_H_ #define Algorm_H_ #ifdefAlgorm_EXPORTS #define Algorm_API extern"C" ...

    关于MFC中类的dll制作及调用
    在vs2010新建项目中创建mfcdll,选择带静态链接MFC的规则;
    首先是你创建的dll项目的头文件

    #ifndef Algorm_H_
    #define Algorm_H_
    
    #ifdef  Algorm_EXPORTS
    #define Algorm_API extern"C" _declspec(dllexport)//dll
    #else
    #define Algorm_API  extern"C"_declspec(dllimport)//user
    #endif
    
    #include "stdafx.h"//你需要的头文件
    class _declspec(dllexport)  Algorm
    {
        public:
            Algorm();
            ~Algorm();
          public:
            void myAlgorm(float *pData, float *Pj, float *pa, int rows, int Num, int Level);
             void myAction(float *oi, float si, float co, int rows, float *res);
                //其他 int,float 数据定义是一样的
    
          };
    #endif


    然后是你创建的dll项目的运行文件.cpp

    #include "StdAfx.h"
    #include"stdio.h"
    #include"Algorm.h"//你需要的头文件
    Algorm::Algorm()
    
    {
    }
    Algorm::~Algorm()
    
    {
    }
    _declspec(dllexport) void myAlgorm(float *pData, float *Pj, float *pa, int rows, int Num, int Level)
    {
      //函数实现主体
    }
    _declspec(dllexport)  void myAction(float *oi, float si, float co, int rows, float *res)
    {
         //函数实现主体
    }


    调试时选择relase版本,平台的话与接下来要调用的一致就行


    在别的程序中调用了,这里用的是静态链接

    1.把生成的dll放在release或debug(你所需要的)下与生成的exe在一个目录里;
    把头文件Algorm.h 和 Algorm.lib的路径在项目属性中添加。2.程序内为
     

    #include "Algorm.h"
    #pragma comment(lib, "Algorm.lib")
    class _declspec(dllimport)  Algorm;
    
    Algorm  algorm;//实例化
    algorm.myAlgorm(float *pData, float *Pj, float *pa, int rows, int Num, int Level);//调用即可
    
    

     

    展开全文
  • Dll制作和使用教程二

    千次阅读 2015-11-12 15:12:09
    步骤一:首先将dll制作好后的头文件、dll文件、lib文件拷贝到调用该dll的工程中。 步骤二:用教程一中隐式调用的方法将dll加载到该工程内即可。 方式二、__declspec(dllexport)制作方式和显式调用相合 注意:这种...
  • E源码简单的DLL制作及使用例.rar简单的DLL制作及使用例.rar简单的DLL制作及使用例.rar
  • 各种DLL制作方法

    千次阅读 2009-06-09 17:35:00
    各种DLL制作方法一.创建MFC 的常规DLL(设工程名为MyDLL1)(详工程F:/VcSample/DLL示例/DLL动态联接库之构共享内存)1. 新建工程MFC AppWizard(dll),选第二项- Regular DLL using shared MFC DLL(选第一项:Regular DLL...
  • 用C# itextsharp.dll制作PDF文件全攻略
  • DLL制作演示文档

    2019-04-03 15:39:10
    整理一篇之前制作过得dll演示文档,还是之前用的vs2010版本的。 打开VS2010,新建Project工程文件,选择新建一个Win32 Console Application,在接下来的文件中,overview切换到application settings选项,按如图所...
  • VB6.0_DLL制作工具(修订版 Ver1.2)

    热门讨论 2013-10-27 18:42:18
    VB6.0 DLL制作工具(修订版) 让VB6.0也可以方便的制作“标准DLL”,链接的文件不再是ActiveX DLL! 压缩包有说明文件、图样、示例程序。 了解更多信息,请到:http://bbs.csdn.net/topics/390609644 在这里顺带说...
  • VC 纯资源DLL制作及调用

    千次阅读 2014-11-03 20:42:11
    VC 纯资源DLL制作及调用 纯资源 DLL 是仅包含资源(如图标、位图、字符串和对话框)的 DLL。使用纯资源 DLL 是在多个程序之间共享同一组资源的好方法。提供其资源被针对多种语言进行本地化的应用程序也是...
  • 用VC纯资源DLL制作多语言界面程序

    热门讨论 2010-09-20 10:12:21
    用VC纯资源DLL制作多语言界面程序 参考例子代码(内附开发说明文档)
  • 高级软件工程,分别在VS和在VB上实现了简单的DLL制作和调用,并分别在VS和VB上进行了测试。
  • 动态链接库dll制作

    2013-08-29 16:41:23
    主要是关于动态链接库(dll)的制作,包含一些相关的程序里程和说明,浅显易懂
  • 该示例包含__declspec(dllexport)和def两种制作方式,包含隐式和显式两种调用方式。
  • 使用DLL制作插件程序(含源码) delphi DLL
  • 使用DLL制作插件程序(含源碼),与我刚开始上传的是两个不同的例子.
  • 511遇见易语言DLL制作调用及hook注入

    万次阅读 2020-05-16 17:02:11
    1-VB6.0调用易语言编写的dll 2-C#调用易语言编写的dll 3-C++和python调用易语言编写的dll 4-VB.net调用易语言易语言编写的Dll 5-易语言调用VB6.0编写的ActiveX Dll 6-易语言调用VB.net编写的Dll 7-易语言调用...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,832
精华内容 1,532
关键字:

dll制作