MFC工程中调用外部EXE资源...

本文介绍了一种在VC++项目中检测并安装USBKey管理工具的方法。通过将外部EXE文件作为资源导入项目,并利用Windows API函数如FindResource()、LoadResource()等进行资源操作,最终实现自动安装过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

最近在做网银检测工具,在其中需要检测USBKey管理工具是否安装,如果没有安装的话,需要修复安装,废话不多说,基本的操作流程是:

(1)、把外部EXE程序加入到VC工程资源Resource中,即Resource ->import —>自定义资源名称

 

(2)、在工程名、rc下就会有相应的ocx控件资源列表项.

 

(3)、打开Projecft.rc 中找到

IDR_EXE2   EXE   DISCARDABLE     "res//*.*"

其中IDR_EXE2 是资源的的ID, EXE是定义资源的Type, "res//*.*"是资源的相对路径。

 

(4)、在工程的某些函数处需要调用这些资源时,就要用到下面的windows API函数:

 FindResource()、LoadResource()、SizeofResource() 和LockResource() ,不要忘记最后 FreeResource()哦...

这几个函数的参数原型可以上Google去百度下...只要不是“敏感词”就能sou到...

具体的调用流程就是如此easy:

 

  HINSTANCE  hInst  = NULL;

  HRSRC hResInfo = FindResource(hInst, MAKEINTRESOURCE(资源ID), “资源类型”); //定位我们的自定义资源

 

  DWORD  cbLen= SizeofResource(hInst, hResInfo);  //获得资源的大小 (PS:这步我觉得可有可无)

 

  HGLOBAL hGlobal = LoadResource(hInst, hResInfo);  //加载资源实例..

  

  LPVOID lp= LockResource(hGlobal);   //锁定资源..便于对资源操作...

 

  LockResource()函数返回 LPVOID类型的值,用户可以对资源的返回值自定义例如:

   BYTE *bc; bc = (BYTE *)LockResource(hGlobal);Next 可以对资源对应bc进行操作了

  

 感觉自己废话太多了...这些google上都有..具体到个人的工程中,那就用卡尔.马克思的主义的“具体问题具体分析”了..

 

(5)、在我的工程中,是要将一个安装文件(exe格式)作为一个资源加入到MFC工程中,具体步骤就是前三步,第四步是相应源码中实现的..套用魔术大师--刘谦的口头禅:接下来就是见证奇迹的时刻了..不错,下面就是具体问题具体分析了(估计是高中受政治课的迫害太深):

 

    CString filename = _T("CDYHKEY.exe"); //自定义一个文件名称,用于下面的调用


    HANDLE fp = ::CreateFile(filename,GENERIC_WRITE,0,NULL,CREATE_ALWAYS,0,NULL);  //创建一个临时文件,就在当前目录下(如果最后不想保留这个临时文件的话可以调用 DeleteFile(LPCSTR 文件名称)删除)

 

    DWORD a;  WriteFile(fp,lp,nDataLen,&a,NULL);//向临时文件中写入lp对应的资源数据...

 

     CloseHandle(fp);   //关闭文件句柄  (MS没有这步的话直接ShellExecute 返回值 < 32)  
     FreeResource(hMem);  //释放资源文件

   //接着就可以用ShellExecute()执行filename对应的资源文件了...各参数的含义可以google之...

   int n = (int)ShellExecute(NULL,_T("open"),_T("CDYHKEY.exe"),_T(""),_T(""), SW_SHOW );

   返回值n > 32 则执行成功,否则返回值是什么就找相应的错误代码...

...............相关的操作至此over,

PS:11月19号 《哈利波特和死圣(上)》内地上映...等能一年终于等到了...再想看看赫敏,斯内普教授(传说中的Prince of Half-Blood),下部据说2011年7月上映..好难等啊...

致高傲的混血王子---哈迷中流传的一段话,很发人深思:

      曾经看过一部电影,它说人在临死前的那一刻,记忆中最美丽的片段会快速的在人的眼前倒带,然后播放。那么什么是最美丽的片段呢?是她在秋千上的摇摆?还是在校园中榉树下走过的她的身影?是消失的夕阳?还是短暂的快乐?如今她已经埋葬在阴冷的山谷中,身边躺着的是她深爱的丈夫,而他却流尽热血,孤独的倒在沉重的誓言下.....

     最感动的莫过于斯内普死前的对哈利的说的那句话:Look ..at ..me!!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

<think>我们正在解决一个关于VisualStudio中使用MFC.lib文件进行调试的问题。用户希望了解如何通过.lib文件启动并调试调用的程序。根据引用[1]和[2]的内容,我们知道在MFC工程中添加.lib和.dll文件是常见的操作。引用[1]提到当出现无法打开.lib文件的错误时,可以通过在项目属性中设置“继承的值”来解决(具体是勾选某个选项)。引用[2]则详细说明了如何在已有的MFC工程中添加.lib和.dll文件。调试一个使用外部.lib文件的程序,通常包括以下步骤:1..lib文件添加到项目中,以便链接器能够找到它。2.确保.dll文件在运行时可用(如果.lib是动态库的导入库)。3.设置调试环境,包括源代码的路径(如果需要调试.lib内部的代码,需要有对应的.pdb文件和源代码)。但是,用户的问题是如何“通过.lib文件启动并调试调用的程序”。这里可能有两种情况:-情况1:用户自己有一个.lib文件(可能是静态库或动态库的导入库),并且想要在自己的MFC程序中调用这个库,然后调试整个程序(包括库中的代码)。-情况2:用户有一个.lib文件,并且想直接调试这个库(但.lib文件通常是库文件,不是可执行文件,所以不能直接启动)。由于用户提到了“启动”程序,我们假设是情况1:即用户有一个MFC应用程序,该程序使用了外部.lib文件(可能是静态库或动态库的导入库),用户想要启动这个MFC应用程序并调试它,包括在调用.lib中的函数时能够进入库的代码进行调试。步骤:1.**添加.lib文件到项目**:-在解决方案资源管理器中,右键单击项目,选择“属性”。-转到“链接器”->“输入”->“附加依赖项”,在这里添加.lib文件的名称(例如:mylib.lib)。-或者,也可以直接在代码中使用`#pragmacomment(lib,"mylib.lib")`。2.**设置.lib文件的路径**:-在项目属性的“链接器”->“常规”->“附加库目录”中,添加.lib文件所在的目录。3.**确保运行时能够找到.dll文件(如果是动态库)**:-将.dll文件放在可执行文件(.exe)所在的目录,或者放在系统路径中。4.**调试库中的代码**:-如果.lib文件是静态库,并且你有该库的源代码和调试信息(.pdb文件),那么当你单步执行到库中的函数时,调试器会自动进入库的源代码。-需要确保:-静态库在编译时生成了调试信息(在编译库的项目中,配置为Debug模式,并生成.pdb文件)。-你的项目在Debug模式下编译,并且调试器能够找到库的源代码(源代码路径要设置正确,或者源代码在库编译时的相同路径下)。-如果是动态库(.dll),同样需要确保有调试信息(.pdb)和源代码。5.**启动调试**:-按F5启动调试,程序开始运行,当调用到库中的函数时,如果调试信息可用且源代码路径正确,就可以进入库的代码进行调试。引用[2]中提到,对于已经存在的MFC工程,添加.lib和.dll的方法。所以,我们按照上述步骤操作后,应该可以正常调试。但是,如果调试时无法进入库的代码,可能是因为:-没有库的源代码(只有头文件和.lib,那么只能调试到函数调用,无法进入函数内部)。-没有对应的调试信息(.pdb文件)。确保库在编译时生成了调试信息,并且.pdb文件与.lib在同一目录(或调试器能够找到它)。另外,引用[1]中提到的错误LNK1104,如果我们在添加.lib时出现这个错误,可以尝试:-检查路径是否正确。-检查文件名是否正确(包括大小写、扩展名)。-或者按照引用[1]中提到的,在项目属性的“VC++目录”->“库目录”中,勾选“继承的值”(Inheritfromparentorprojectdefaults),或者手动添加正确的库目录。总结:在VS中使用MFC.lib文件进行调试,关键是正确配置库的链接,并确保调试信息(.pdb)和源代码可用。现在,根据要求,生成相关问题:</think>### 在 Visual Studio 中使用 MFC.lib 文件调试程序的方法 在 Visual Studio 中调试使用 MFC外部 .lib 文件的程序,需完成以下关键步骤: #### 1. **正确添加 .lib 文件到项目** - **方法1:项目属性配置** 1. 右键项目 → 属性 → 链接器 → 输入 → 附加依赖项 2. 添加 .lib 文件名(如 `mylib.lib`) 3. 在 链接器 → 常规 → 附加库目录 中添加 .lib 文件所在路径[^2] - **方法2:代码指令** 在源文件中添加编译指令: ```cpp #pragma comment(lib, "mylib.lib") ``` #### 2. **配置调试环境** - **调试符号设置**: 1. 项目属性 → 链接器 → 调试 → 生成调试信息 → 选择 `/DEBUG` 2. 确保 .lib 文件编译时包含调试信息(PDB 文件)[^3] - **路径配置**: - 将 .dll 文件(若有)放入输出目录(如 `Debug/`) - 在 调试 → 环境 中添加路径: ``` PATH=$(SolutionDir)Debug;%PATH% ``` #### 3. **调试关键操作** - **断点设置**: - 在调用 .lib 函数的代码行设置断点 - 若拥有 .lib 的源代码,可直接在库源文件中设断点 - **单步调试**: - 按 F11 可进入 .lib 中的函数(需源代码和 PDB 文件) - **调试信息验证**: - 查看 模块窗口(调试 → 窗口 → 模块)确认 .lib/.dll 已加载符号 #### 4. **常见问题解决** - **LNK1104 无法打开 .lib 错误**: - 检查文件路径是否含空格/特殊字符 - 在 项目属性 → VC++ 目录 → 库目录 中勾选"继承父级或项目默认值"[^1] - **调试时提示"无可用源"**: - 确保 .pdb 文件与 .lib 在相同目录 - 在 工具 → 选项 → 调试 → 符号 中添加 .pdb 路径 > **注意**:若 .lib 对应动态库(.dll),需确保: > - 编译时 .lib 作为"导入库"使用[^2] > - 运行时 .dll 位于可访问路径(如输出目录或系统 PATH) #### 调试流程示例 ```mermaid graph TB A[添加.lib到附加依赖项] --> B[配置附加库目录] B --> C[设置调试信息生成/DEBUG] C --> D[部署.dll到输出目录] D --> E[在调用处设断点] E --> F[按F5启动调试] F --> G{是否进入库代码?} G -- 是 --> H[按F11单步跟踪] G -- 否 --> I[检查PDB配置] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值