编程技巧vc下把转成dll文件.doc_第1页
编程技巧vc下把转成dll文件.doc_第2页
编程技巧vc下把转成dll文件.doc_第3页
编程技巧vc下把转成dll文件.doc_第4页
编程技巧vc下把转成dll文件.doc_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

编程技巧:vc下把.exe转成dll文件 【文章标题】: 编程技巧:vc下把.exe转成dll文件【文章作者】: vbcs【作者邮箱】: 【作者主页】: /vbcs003【下载地址】: /vbcs003【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!-【详细过程】VC下把EXE程序改称DLL文件.dsp工程文件,文本格式,不可丢失或损坏 .dsw工作区文件,丢失或损坏时,可点击.dsp文件打开工程,.dsw文件自动重建 .clwClassWizard信息文件,ini格式,ClassWizard出问题时可删除它再重建 .map映像信息文件,编制DLL写.def文件时,若不知道函数导出顺序,可在 PrjectSettingsLink 页中选中Generate mapfile,重新build, 用记事本或其它类似程序打开生成的.map文件,里面可看到函数导出表 .i 在命令行环境下输入:cl *.cpp /P (注意后面的参数P大小写敏感), 程序文件夹中会生成.i文件,用记事本或其它类似程序打开,可看到.cpp 文件经预处理后的结果 .ncb无编译浏览文件,当自动完成功能(自动显示成员变量列表)出问题时, 可删除它,build 后自动重建。 其它: .aps资源辅助文件,二进制格式 .opt开发环境参数(如工具条位置)文件 .plg编译信息(如error和warning信息)文件,html格式 .pch预编译文件,可加快编译速度,但改文件非常大 .pdb记录程序相关的数据和调试信息 .expdll信息文件,编译dll时才会生成 .bsc用于浏览项目信息,可在 Prject Settings Link 页中勾掉Generate Browse Info File, 禁止生成.bsc文件,以加快编译速度。但若使用Source Browser的话 就必须有这个文件说到这里其它今天对我们有用的也就是*.dsp文件,它里面存放的是工程的一些配置信息。所以为了实现今天我们今天的目的,我们就要来改变*.dsp里面的配置信息,这样就可以把一个.exe文件转换成我们需要的dll文件。好了,下面我们就开始动手吧:1 我们创建三个VC工程。命名分别为:DemoDll(Dialog类生成的.exe,用来把它转换成我们想要的DLL文件),DLL(默认的MFC DLL),CallDall(Dialog类用来调用我们转换成的Dll文件)2 分别打开DemoDll.dsp Dll.dsp文件其中两个文件的具体内容我就不再这里列出来了,只是把不同点给大家列一下。(上面得是DLL文件(红色),下面得是EXE文件(蓝色)(1)# TARGTYPE Win32 (x86) Dynamic-Link Library 0x0102# TARGTYPE Win32 (x86) Application 0x0101(2)!MESSAGE DemoDll - Win32 Release (based on Win32 (x86) Dynamic-Link Library)!MESSAGE exe - Win32 Release (based on Win32 (x86) Application)(3)!MESSAGE DemoDll - Win32 Debug (based on Win32 (x86) Dynamic-Link Library)!MESSAGE exe - Win32 Debug (based on Win32 (x86) Application)(4)# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D WIN32 /D NDEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /Yustdafx.h /FD /c# ADD BASE CPP /nologo /MD /W3 /GX /O2 /D WIN32 /D NDEBUG /D _WINDOWS /D _AFXDLL /Yustdafx.h /FD /c(5)# ADD CPP /nologo /MD /W3 /GX /O2 /D WIN32 /D NDEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /D _MBCS /D _USRDLL /Yustdafx.h /FD /c# ADD CPP /nologo /MD /W3 /GX /O2 /D WIN32 /D NDEBUG /D _WINDOWS /D _AFXDLL /D _MBCS /Yustdafx.h /FD /c(6)# ADD BASE LINK32 /nologo /subsystem:windows /dll /machine:I386# ADD BASE LINK32 /nologo /subsystem:windows /machine:I386 (7) # ADD LINK32 /nologo /subsystem:windows /dll /machine:I386# ADD LINK32 /nologo /subsystem:windows /machine:I386(8)# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /Yustdafx.h /FD /GZ /c# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _AFXDLL /Yustdafx.h /FD /GZ /c(9) # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /D _MBCS /D _USRDLL /Yustdafx.h /FD /GZ /c# ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _AFXDLL /D _MBCS /Yustdafx.h /FD /GZ /c(10) # ADD BASE LINK32 /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept# ADD BASE LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept(11)# ADD LINK32 /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept# ADD LINK32 /nologo /subsystem:windows /debug /machine:I386 /pdbtype:sept好了,两个文件的不同点,我已经给大家标出来了,当然这里标出来的就只是我们需要修改的,所以真正的不同点不止这此。为了实现今天我们的功能这们只要修改上面我标出来的就可以了。这就是我修改之后的DemoDll.dsp(1) # TARGTYPE Win32 (x86) Dynamic-Link Library 0x0102(2) !MESSAGE DemoDll - Win32 Release (based on Win32 (x86) Dynamic-Link Library)(3) !MESSAGE DemoDll - Win32 Debug (based on Win32 (x86) Dynamic-Link Library)(4) # ADD BASE CPP /nologo /MD /W3 /GX /O2 /D WIN32 /D NDEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /Yustdafx.h /FD /c(5) # ADD CPP /nologo /MD /W3 /GX /O2 /D WIN32 /D NDEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /D _MBCS /D _USRDLL /Yustdafx.h /FD /c(6) # ADD BASE LINK32 /nologo /subsystem:windows /dll /machine:I386(7) # ADD LINK32 /nologo /subsystem:windows /dll /machine:I386(8) # ADD BASE CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /Yustdafx.h /FD /GZ /c(9) # ADD CPP /nologo /MDd /W3 /Gm /GX /ZI /Od /D WIN32 /D _DEBUG /D _WINDOWS /D _WINDLL /D _AFXDLL /D _MBCS /D _USRDLL /Yustdafx.h /FD /GZ /c(10) # ADD BASE LINK32 /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept(11) # ADD LINK32 /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept(12) 还要把BOOL CDemoDllApp:InitInstance()文件中的:#ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); / Call this when linking to MFC statically#endif给注释掉.好的,就这些了,上面就是我修改之后的DemoDll.dsp文件的内容,总共需要修改的是13处,其实没也没有什么,只要大家好好的看清楚也就OK了。好了,文件我们也就转换好了,就让我们来调用一下试试吧:CallDll.exe:void CCallDllDlg:OnOK() / TODO: Add extra validation hereHINSTANCE hInstance;hInstance=:LoadLibrary(.DemoDllDemoDll.dll);if(!hInstance)MessageBox(LoadLibrary is falied!);return;FreeLibrary(hInstance);CDialog:OnOK();具体执行效果我就不在这里贴出来了,大家在自己执行一下就可以看到执行效果。注:其实我们这样得程序是由问题得:不知道大家在调用HINSTANCE hInstance=NULL;hInstance=:LoadLibrary(Dll Path);的时候有没有发现在载入DLL的时候,它的返回传值hInstance始终是为0的,也就是说,如果我们想在我的程序中给DLL文件中的窗口或者函数传递参数是没有办法的。因为我们没有办法来调用DLL的入口函数。所以说呢,我们这样生成的DLL文件其实意义并不是很大的,只相当于我们以另一种形式在我们的当前的程序用调用了另一个小程序或者说的窗口。既然有问题,那我们就要解决,但还是有必要来分析一下为什么我们的LoadLibrary的返回总是为0呢,难道是说我们没有载入或者说是载入失败,不可能的如果是这样那我们的程序为什么会运行起来的,那看来还是别有蹊跷的。大家不会忘记在InitInstance()中有下面这样一段代码吧:CResourceDDlg dlg;m_pMainWnd = &dlg;int nResponse = dlg.DoModal();if (nResponse = IDOK)/ TODO: Place code here to handle when the dialog is/ dismissed with OKelse if (nResponse = IDCANCEL)/ TODO: Place code here to handle when the dialog is/ dismissed with Cancel看到这里的时候,想必大家已经知道引起问题的罪魁祸首是谁了吧!不错就是那个DoModal()正是由于它的存在,才使我们的程序在被成功加载的之后,没有返回我们所想要的值。因为在我们的程序在调用DLL的时候,(在MFC中程序的执行顺序我在这里就不再多说了,大家应该非常清楚的)当执行到了DoModall的时候(说到这里我感觉我还是有必要和大家讨论一下VC中的对话框:在VC中对话框分为两类一是模式对话框二是无模式对话框。两者的主要区别在于:显示模式对话框需要调用CDialog:DoMaodal,而显示模式对话框则要调用CDialog:Create.DoModal要等到对话框被消除之后才返回。而和DoModal不同,一旦建立对话框,Create就返回,因此,Create返回时对话框还处于显示状态。清除模式对话框要调用DestroyWindow,而不是EndDialog.禁止对无模式对话框调用CDialog:OnOk或CDialog:OnCancel,因为两者都调用EndDialog.模式对话框类通常在堆栈上实例化,所以析构是自动实现的,而无模式对话框通过NEW实例化,所以该对话框对象不会过早地被消除。如果要确保消除对话框时删除无模式对话框对象,一种方法是在派生的对话框类中覆盖CDialog:PostNcDestroy并执行delete this语句.当然模式对话框我无模式对话框还是有区别的,不过今天我们就只提到对我们有用的。有兴趣的大家可以自己研究),也就是说欠产在调用一个模式对话框并且让它显示了出来,但是我们不要忘记上面提到的模式对话框的特点,DoModal一定要等到对话框被返回的时候,才被消息,所以呢当我们在执行的时候,我们的DLL文件一但进入到这里面的时候,除非清除它否则我们是无法返回的。这也就造成了为什么我们的返回值一直为空,知道产生这个问题的原因了,接下来要解决这个问题也很简单。造成没有返回值的原因是因为模式对话框,那好了,我们不用它了,改成无模式对话框那总好了吧。所以我们的代码修改如下:BOOL CDemoDllApp:InitInstance()AfxEnableControlContainer();/ Standard initialization/ If you are not using these features and wish to reduce the size/ of your final executable, you should remove from the following/ the specific initialization routines you do not need./*#ifdef _AFXDLLEnable3dControls(); / Call this when using MFC in a shared DLL#elseEnable3dControlsStatic(); / Call this when linking to MFC statically#endif*/*利用无模式对话框*/pDlg=new CDemoDllDlg;m_pMainWnd = pDlg;pDlg-Create(IDD_DEMODLL_DIALOG); pDlg-ShowWindow(SW_HIDE);/ int nResponse = pDlg-DoModal();/

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论