精华内容
下载资源
问答
  • 一个简单的DLL 的实现和调用,通过这个例子可以了解怎么建立dll,使用dll调试dll,文章在我的blog: http://blog.csdn.net/cau_eric/article/details/9119235
  • DELPHI 2010 动态链接库DLL断点调试 马根峰 (广东联合电子服务股份有限公司,广州 510300) 摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术 关键词:DELPHI 2010;Dll断点调试; 1...

    DELPHI 2010 动态链接库DLL断点调试

               马根峰 

                (广东联合电子服务股份有限公司,广州 510300)

     

     

    摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术

    关键词DELPHI 2010Dll断点调试;

     

     

     

    1      Delphi几个经典版本简介 

    Delphi1995年的 1.0版本,发展到现在的最新的XE3版本,历经N多版本,但最为经典的几个版本个人觉得应属 7.02007 2010

    Delphi 7.0应该是Delphi用户最多的版本。

    Delphi 2007是功能就不多说了,归根结底一句话,它是 AnsiString的最后一个版本,在Delphi 2007中,string类型映射为AnsiStringchar类型映射为AnsiCharPchar类型映射为PAnsiChar。所以DELPHI低版本的程序可以较轻松地迁移到DELPHI 2007版本。Delphi 2007也是Delphi程序员很容易上手的晚期版本。

    Delphi2009开始起,到现在的Delphi XE3为止,都是 unicode版本。String类型映射为 UnicodeString而不是 AnsiStringChar类型映射为 WideCharPChar类型映射为 PWideChar

    由于Delphi 7.02007 2010在界面上乃至功能上的一些变化,所以在动态链接库DLL断点调试上,有较大的变化。在今后几天的时间中,笔者会以三篇文章来分别详细地介绍Delphi 7.02007 2010这三个版本中的DLL断点调试技术。

    本篇文章来详细地介绍 Delphi 2010中的动态链接库DLL断点调试技术。

     

     

     

    2    DELPHI 2010DLL断点设置与DLL调试

    DELPHI 7.0以及以前的版本中,动态链接库的调试方法如下:

    点击菜单Run-->Parameters.打开Run Parameters窗口,如图1所示。 

          图1 点击菜单Run-->Parameters.打开Run Parameters窗口

     

    设置图中断点,然后点击F9或者Run—Run来运行宿主程序Delphi2007_Dll_Debug.exe,但发现断点无效,如图2所示:  

          2 设置断点后,运行宿主程序Delphi2007_Dll_Debug.exe,断点无效

     

    点击Project-->Options..,在Project Options窗口中,在Delphi Compiler—Compiling属性页中将Debug information设置为True,如图3所示: 

          3 Delphi Compiler—Compiling属性页中将Debug information设置为True

     

    点击Project-->Options..,在Project Options窗口中,在Delphi Compiler—Linking属性页中将Debug informationInclude remote debug symbols两项设置为True,如图4所示:  
           
    4 Debug informationInclude remote debug symbols两项设置为True

     

    运行宿主程序Delphi2007_Dll_Debug.exe,断点还是无效,如图5所示:
     

          5 运行宿主程序Delphi2007_Dll_Debug.exe,发现断点还是无效

     

    切换到DelphiDLL工程文件上,点击ctrl+alt+M,跳出一个名叫Modules的窗体来。左上角显示了宿主程序本身及其它所调用的资源。

    找到动态链接库 Magenf_Detail.dll项,发现目录没有指向当前DLL所在的目录。点击鼠标右键,选中菜单项“Reload Symbol Table…”如图6所示:
     
     

          6 打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,Reload Symbol Table…

     

    重新设置动态链接库Magenf_Detail.dll的位置,选中当前DLL工程Magenf_Detail所在目录的动态链接库Magenf_Detail.dll文件,如图7所示:
     
     

          7 打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,Reload Symbol Table…,重新设置它的位置

     

    然后切换到Delphi的属性页Magenf_Detail,发现断点生效,如图8所示:
     

          8 点击属性页Magenf_Detail,发现断点生效

     

    Delphi2007_Dll_Debug.exe,输入 12后点击铵钮“=”,如图9所示: 
     

          9 Delphi2007_Dll_Debug.exe,输入 12后点击铵钮“=

     

    进入DLL断点调试,如图10所示:



          
    10 进入DLL的断点调试

     

     

     

    3        例子中的宿主程序及DLL程序代码

    -------宿主程序代码-----

    unit UDllDebug;

     

    interface

     

    uses

      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

      Dialogs, StdCtrls, ExtCtrls, Buttons, Contnrs ,  ActiveX, StrUtils ;

     

    type

     

      

     

        

      TDll_Add=function(int_1,int_2:integer):integer;stdcall;

      TfrmDllDebug = class(TForm)

        Edit1: TEdit;

        Edit2: TEdit;

        Label1: TLabel;

        Edit3: TEdit;

        BtnAdd: TButton;

        procedure FormCreate(Sender: TObject);

        procedure FormClose(Sender: TObject; var Action: TCloseAction);

        procedure BtnAddClick(Sender: TObject);

      private

        { Private declarations }

      public

        { Public declarations }

     

        HInst:Thandle;                                    

        FDll_Add:TFarProc;

        functionDll_Add:TDll_Add;

     

        //aForeThread:MuliThread;

      end;

     

    var

      frmDllDebug: TfrmDllDebug;

     

    implementation

     

    {$R *.dfm}

     

     

     

                   

      

    procedure TfrmDllDebug.FormCreate(Sender: TObject);

    begin

           hinst:=loadlibrary('Magenf_Detail.dll'); 

           if hinst>0 then

           begin

                 FDll_Add:=getprocaddress(hinst,pchar('Dll_Add'));

     

                 if FDll_Add<>nil then

                    functionDll_Add:=TDll_Add(FDll_Add)

                 else

                    messagedlg(&apos;Fatal error! Function not be found!&apos;,mtWarning, [mbYes], 0) ;

             end

             else

                 messagedlg(&apos;Fatal error! Magenf_Detail.dll not be found!&apos;,mtWarning, [mbYes], 0) ;

     

    end;

     

    procedure TfrmDllDebug.FormClose(Sender: TObject;

      var Action: TCloseAction);

    begin

        try

            freelibrary(hinst);

        except

        end;

     

    end;

            

     

     

     

     

    procedure TfrmDllDebug.BtnAddClick(Sender: TObject);

    var

        int1,int2,int_return:integer;

    begin

     

        int1:=strToInt(edit1.Text);

        int2:=strToInt(edit2.Text);

        int_return:=functionDll_Add(int1,int2);

        edit3.Text :=intToStr(int_return);

     

    end;

     

    end.

    -------宿主程序代码-----

     

    -------DLL程序代码-----

    library Magenf_Detail;

      

    uses

      SysUtils,Classes;

     

    {$R *.RES}

     

     

     

    function    Dll_Add(int_1,int_2:integer):integer;stdcall;

    var

         intSum:integer;

    begin

        intSum:=int_1+int_2;

        result:=intSum;

    end;

     

     

    exports

        Dll_Add;

     

    end.

     

    -------DLL程序代码-----

    转载于:https://www.cnblogs.com/s-Yang/p/3152082.html

    展开全文
  • 本篇文章来详细地介绍 Delphi 2007中的动态链接库DLL断点调试技术。
  • 由于Delphi 7、2007和 2010在界面上乃至功能上的一些变化,所以在动态链接库DLL断点调试上,有较大的变化。在今后几天的时间中,笔者会以三篇文章来分别详细地介绍Delphi 7、2007和 2010这三个版本中的DLL断点调试...
  • 本篇文章来详细地介绍 Delphi 7中的动态链接库DLL断点调试技术。
  • 本篇文章来详细地介绍 Delphi 2010中的动态链接库DLL断点调试技术。
  • DELPHI 2010 动态链接库DLL断点调试

    千次阅读 2013-03-04 12:12:49
    DELPHI 2010 动态链接库DLL断点调试  马根峰   (广东联合电子服务股份有限公司,广州 510300)   摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术 关键词:DELPHI 2010;Dll断点调试;   ...

     

    DELPHI 2010 动态链接库DLL断点调试

               马根峰 

                (广东联合电子服务股份有限公司,广州 510300)

     

    摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术

    关键词DELPHI 2010Dll断点调试;

     

     

     

    1      Delphi几个经典版本简介 

    Delphi1995年的 1.0版本,发展到现在的最新的XE3版本,历经N多版本,但最为经典的几个版本个人觉得应属 7.02007 2010

    Delphi 7.0应该是Delphi用户最多的版本。

    Delphi 2007是功能就不多说了,归根结底一句话,它是 AnsiString的最后一个版本,在Delphi 2007中,string类型映射为AnsiStringchar类型映射为AnsiCharPchar类型映射为PAnsiChar。所以DELPHI低版本的程序可以较轻松地迁移到DELPHI 2007版本。Delphi 2007也是Delphi程序员很容易上手的晚期版本。

    Delphi2009开始起,到现在的Delphi XE3为止,都是 unicode版本。String类型映射为 UnicodeString而不是 AnsiStringChar类型映射为 WideCharPChar类型映射为 PWideChar

    由于Delphi 7.02007 2010在界面上乃至功能上的一些变化,所以在动态链接库DLL断点调试上,有较大的变化。在今后几天的时间中,笔者会以三篇文章来分别详细地介绍Delphi 7.02007 2010这三个版本中的DLL断点调试技术。

    本篇文章来详细地介绍 Delphi 2010中的动态链接库DLL断点调试技术。

     

     

     

    2    DELPHI 2010DLL断点设置与DLL调试

    DELPHI 7.0以及以前的版本中,动态链接库的调试方法如下:

    点击菜单Run-->Parameters.打开Run Parameters窗口,如图1所示。 

          图1 点击菜单Run-->Parameters.打开Run Parameters窗口

     

    设置图中断点,然后点击F9或者Run—Run来运行宿主程序Delphi2007_Dll_Debug.exe,但发现断点无效,如图2所示:  

          2 设置断点后,运行宿主程序Delphi2007_Dll_Debug.exe,断点无效

     

    点击Project-->Options..,在Project Options窗口中,在Delphi Compiler—Compiling属性页中将Debug information设置为True,如图3所示: 

          3 Delphi Compiler—Compiling属性页中将Debug information设置为True

     

    点击Project-->Options..,在Project Options窗口中,在Delphi Compiler—Linking属性页中将Debug informationInclude remote debug symbols两项设置为True,如图4所示:  
           
    4 Debug informationInclude remote debug symbols两项设置为True

     

    运行宿主程序Delphi2007_Dll_Debug.exe,断点还是无效,如图5所示:
     

          5 运行宿主程序Delphi2007_Dll_Debug.exe,发现断点还是无效

     

    切换到DelphiDLL工程文件上,点击ctrl+alt+M,跳出一个名叫Modules的窗体来。左上角显示了宿主程序本身及其它所调用的资源。

    找到动态链接库 Magenf_Detail.dll项,发现目录没有指向当前DLL所在的目录。点击鼠标右键,选中菜单项“Reload Symbol Table…”如图6所示:
     
     

          6 打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,Reload Symbol Table…

     

    重新设置动态链接库Magenf_Detail.dll的位置,选中当前DLL工程Magenf_Detail所在目录的动态链接库Magenf_Detail.dll文件,如图7所示:
     
     

          7 打开Modules属性页,找到Magenf_Detail.dll项,点击鼠标右键,Reload Symbol Table…,重新设置它的位置

     

    然后切换到Delphi的属性页Magenf_Detail,发现断点生效,如图8所示:
     

          8 点击属性页Magenf_Detail,发现断点生效

     

    Delphi2007_Dll_Debug.exe,输入 12后点击铵钮“=”,如图9所示: 
     

          9 Delphi2007_Dll_Debug.exe,输入 12后点击铵钮“=

     

    进入DLL断点调试,如图10所示:



          
    10 进入DLL的断点调试

     

     

     

    3        例子中的宿主程序及DLL程序代码

    -------宿主程序代码-----

    unit UDllDebug;

     

    interface

     

    uses

      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

      Dialogs, StdCtrls, ExtCtrls, Buttons, Contnrs ,  ActiveX, StrUtils ;

     

    type

     

      

     

        

      TDll_Add=function(int_1,int_2:integer):integer;stdcall;

      TfrmDllDebug = class(TForm)

        Edit1: TEdit;

        Edit2: TEdit;

        Label1: TLabel;

        Edit3: TEdit;

        BtnAdd: TButton;

        procedure FormCreate(Sender: TObject);

        procedure FormClose(Sender: TObject; var Action: TCloseAction);

        procedure BtnAddClick(Sender: TObject);

      private

        { Private declarations }

      public

        { Public declarations }

     

        HInst:Thandle;                                    

        FDll_Add:TFarProc;

        functionDll_Add:TDll_Add;

     

        //aForeThread:MuliThread;

      end;

     

    var

      frmDllDebug: TfrmDllDebug;

     

    implementation

     

    {$R *.dfm}

     

     

     

                   

      

    procedure TfrmDllDebug.FormCreate(Sender: TObject);

    begin

           hinst:=loadlibrary(&apos;Magenf_Detail.dll&apos;); 

           if hinst>0 then

           begin

                 FDll_Add:=getprocaddress(hinst,pchar(&apos;Dll_Add&apos;));

     

                 if FDll_Add<>nil then

                    functionDll_Add:=TDll_Add(FDll_Add)

                 else

                    messagedlg(&apos;Fatal error! Function not be found!&apos;,mtWarning, [mbYes], 0) ;

             end

             else

                 messagedlg(&apos;Fatal error! Magenf_Detail.dll not be found!&apos;,mtWarning, [mbYes], 0) ;

     

    end;

     

    procedure TfrmDllDebug.FormClose(Sender: TObject;

      var Action: TCloseAction);

    begin

        try

            freelibrary(hinst);

        except

        end;

     

    end;

            

     

     

     

     

    procedure TfrmDllDebug.BtnAddClick(Sender: TObject);

    var

        int1,int2,int_return:integer;

    begin

     

        int1:=strToInt(edit1.Text);

        int2:=strToInt(edit2.Text);

        int_return:=functionDll_Add(int1,int2);

        edit3.Text :=intToStr(int_return);

     

    end;

     

    end.

    -------宿主程序代码-----

     

    -------DLL程序代码-----

    library Magenf_Detail;

      

    uses

      SysUtils,Classes;

     

    {$R *.RES}

     

     

     

    function    Dll_Add(int_1,int_2:integer):integer;stdcall;

    var

         intSum:integer;

    begin

        intSum:=int_1+int_2;

        result:=intSum;

    end;

     

     

    exports

        Dll_Add;

     

    end.

     

    -------DLL程序代码-----

     

     

        

     

    作者博客:

    CSDN博客:http://blog.csdn.net/magenfeng

    新浪博客: http://blog.sina.com.cn/magenfeng

    QQ空间: http://user.qzone.qq.com/630414817




     

     

    展开全文
  • DLL 动态 静态 编写/调试 DLL 静态 编写调试 MFC
  • C++调试DLL库注意事项

    2019-08-15 14:51:39
    正常情况下将两个工程添加到一个解决方案中,一个是生成DLL库的工程,一个负责调用如下图所示 1 静态调用 静态调用时需要导出DLL库中的函数 #ifndef __SM7_DLL_H__ #define __SM7_DLL_H__ extern "C" ...

     

    本文链接:https://blog.csdn.net/daidi1989/article/details/79924716

    正常情况下将两个工程添加到一个解决方案中,一个是生成DLL库的工程,一个负责调用如下图所示

    1 静态调用

    静态调用时需要导出DLL库中的函数

    #ifndef __SM7_DLL_H__
    
    #define __SM7_DLL_H__
    extern "C"
    
    {
    
    int DECLSPEC_EXPORT Sm_Init(Tcl_Interp* interp);
    
    }
    
    #endif
    
     
    1.  

       

    然后在调用文件中加载lib库

    #include “stdafx.h”
    #include <tcl.h>
    
    #include "Sm7Dll.h"
    #include <string>
    
    using namespace std;
    #pragma comment(lib,"C:/Tcl/lib/tcl85.lib")
    
    #pragma comment(lib,"D:/DD/TCLproject/SM7_DLL_LIB/SM7Dll/Debug/Sm7Dll.lib")
    EXTERN_C int _tmain(int argc, _TCHAR* argv[])
    
    {
    
    Tcl_Interp *interp;
    
    interp = Tcl_CreateInterp();
    Sm_Init(interp);
    
    }
    1.  

    2 动态调用

    动态调用时只需要使用LoadLibrary,GetProcAddress,FreeLibrary三个函数来管理即可。

    实例如下:

    EXTERN_C int _tmain(int argc, _TCHAR* argv[])
    
    {
    
    HMODULE m_hReader = LoadLibrary(_T("Sm7Dll.dll"));
    
    typedef long(*pFun)(Tcl_Interp *interp;);
    pFun Sm_Init;
    
    Sm_Init = (pFun)GetProcAddress(m_hReader,(LPCSTR)("Sm_Init"));
    
    BOOL ret = Sm_Init(interp);
    
    FreeLibrary(m_hReader);
    
    return ret;
    
    }
    1.  

    调试中需要特别注意调用程序为DEBUG版时,DLL库也需要为DEBUG版,这样才能顺利的在DLL库工程中打断点调试。

    展开全文
  • 本文涉及的工程在下面的链接可以下载: ...一、编写动态链接库dll 第一步:建立一个dll的工程。 第二步:创建头文件 dll.h 代码: #ifndef DLL_H #define DLL_H extern "C" __declspec(dllexport) int add(i

    本文涉及的工程在下面的链接可以下载:

    http://download.csdn.net/detail/cau_eric/5602857

    一、编写动态链接库dll

    第一步:建立一个dll的工程。


    第二步:创建头文件 dll.h

    代码:

    #ifndef DLL_H
    #define DLL_H
    extern "C" __declspec(dllexport) int  add(int x,int y);
    #endif

    第三步:创建源文件 dll.cpp

    代码:

    #include "dll.h"
    
    int add(int x,int y)
    {
    	return x+y;
    }

    编译即可得到dll文件。

    二、使用动态链接库dll

    1、创建工程dlltest

    2、创建源文件dlltest.cpp

    代码如下:

    #include <windows.h>
    #include <stdio.h>
    
    typedef int (*lpAddFun)(int,int);
    
    //为了突出如何使用,这里没有处理返回错误的情况
    void main()
    {
    	lpAddFun addFun = NULL;
    	DWORD dw = sizeof(addFun);
    	HMODULE hDll = NULL;
    	hDll = LoadLibrary(L"..\\debug\\dll.dll"); //参数以dll所在实际位置为准
    	addFun = (lpAddFun)GetProcAddress(hDll,"add");
    	printf("2 + 3 = %d",addFun(2,3));
    	FreeLibrary(hDll);
    
    	_flushall();
    	getchar();
    }

    运行结果:



    展开全文
  • 创建DLL 里边会自动为你添加好几个文件: 编写函数 调用DLL 1、静态调用 把那个.lib文件和 .h头文件放到 与.cpp 同一个目录下 引用.lib .h文件: #include "test_dll_1.h" #pragma comment(lib,"test_dll_1.lib...
  • QT4dll运行版 文件调试QT4程序使用 QT4dll运行版 文件调试QT4程序使用 QT4dll运行版 文件调试QT4程序使用QT4dll运行版 文件调试QT4程序使用
  • unity如何调试dll库文件

    千次阅读 2017-08-04 12:47:40
    首先,调试这个dll文件,必须在本地有工程~ 并且安装visual studio tools for unity~这是前提。 我是在visual studio 2015中进行调试的。 然后打开unity中需要调试的脚本文件,在解决方案中添加外部工程,也就是...
  • VS2005中调试DLL库

    千次阅读 2011-03-04 22:06:00
    VS2005中调试DLL库 DLL库是VS2005中编译得到的; 一、找到调用该DLL库的EXE文件所在路径 例如,EXE文件是VC6.0工程的可执行文件。 找到project--》settings,选择Debug选项卡,Executable...
  • 动态链接库调试工具,让你不用写测试代码就可以调试跟踪动态链接库程序,简单应用,体积小,免安装。
  • 有时候,我们制作的是dll,但是这样却不方便自己去调式,可以通过两种方式来进行选择 一、自己写一个main函数的控制台程序,然后在main函数中进行调用封装好的接口(函数)来进行调用测试 第二种参考博客:...
  • 如何调试exe调用的dll库工程

    千次阅读 2018-02-12 10:36:50
    环境描述:我们经常用到dll,有时候会想利用exe调试dll的工程测试一下,该如何配置? 开发环境:vs2010 1.首先保证exe文件依赖的dlldll工程下生成的版本要一致。 2.启动exe文件 3.打开dll工程,在Debug--...

空空如也

空空如也

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

dll库调试