简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用

  • 实验目标
  • 实验流程
    • 一、MFC程序
      • 1.创建MFC项目
      • 2.资源与代码
      • 3.演示效果
    • 二、编译连接windows API程序
      • 1.设置环境变量
      • 2.编译windows API程序
      • 3.连接Windows API程序
    • 三、编译连接MFC程序
      • 1.设置环境变量
      • 2.编译MFC程序
      • 3.连接MFC程序
    • 四、总结
    • 五、参考

实验目标

  • 完成一个简单的MFC程序。
  • 用vs2017的命令行工具cl.exe、linker.exe等编译连接windows API程序和MFC程序。

实验流程

一、MFC程序

1.创建MFC项目

打开vs2017,【文件】→【新建】→【项目】

选择【MFC应用】,自己设置名称和位置,点击确定

然后一直下一步直至完成

2.资源与代码

在右侧的资源管理器中打开【源文件】目录,将文件删剩pch.cpp

右键【源文件】,选择添加MFCapp.cpp,并输入代码如下

#include  "pch.h"//自定义窗口
class  Cwin : public  CFrameWnd
{public:Cwin(){Create(NULL, _T("MFC windows"), WS_OVERLAPPEDWINDOW, rectDefault);}
};// 定义应用程序类。
class  CMFCApp : public  CWinApp
{public://程序入口virtual BOOL InitInstance();
};BOOL CMFCApp::InitInstance()
{m_pMainWnd = new Cwin();m_pMainWnd->MoveWindow(450,250,400,300, FALSE);        //设置窗口大小分别是宽,高,x,ySetWindowLong(m_pMainWnd->m_hWnd, GWL_STYLE, WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU);m_pMainWnd->ShowWindow(m_nCmdShow);      //显示窗口CDC* dc = m_pMainWnd->GetDC();        //绘图区CRect rect = CRect(0, 0, 450, 125);       //背景覆盖范围dc->FillSolidRect(&rect, RGB(0, 255, 0));    //设置背景颜色dc->SetBkMode(TRANSPARENT);      //当文不在背景色范围外时,使得文字本身不带背景色dc->TextOutW(0, 125, _T("Hello World"));     //显示文字,分别是x,y,和显示内容m_pMainWnd->UpdateWindow();        //更新窗体return TRUE;      //返回TRUE进入消息循环
}// 应用程序类实例
CMFCApp Cwin;

3.演示效果

点击调试运行

二、编译连接windows API程序

1.设置环境变量

桌面右键【此电脑】,选择【属性】,在系统面板中选择【高级系统设置】,然后在【高级】中点击【环境变量】

然后在环境变量中双击【Path】进入编辑界面,在文件夹中搜索【cl.exe】并将其路径复制下来

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\bin\Hostx64\x64

这是我将vs默认安装在c盘的路径
选择【新建】,将路径粘贴进去

点击确定后,在用户变量中点击【新建】

在【变量名】处填LIB

然后在【变量值】中填入以下4个地址
注意地址与地址之间用“;”隔开

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\lib\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\um\x64
C:\Program Files (x86)\Windows Kits\10\Lib\10.0.17763.0\ucrt_enclave\x64

同样的,在用户变量中新建变量,在【变量名】中填INCLUDE

然后在【变量值】中填入以下6个地址

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\include
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\cppwinrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\shared
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\ucrt
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\um
C:\Program Files (x86)\Windows Kits\10\Include\10.0.17763.0\winrt

设置完毕后点击确定即可
快捷键win+r打开运行对话框,打开cmd,输入cl命令后显示如下即环境配置成功。

2.编译windows API程序

所用到的Windows API程序:Windows API程序设计入门(一个简单的窗口)
找到winapp.c的文件夹,在路径处输入cmd,然后回车进入cmd界面

输入cl命令

cl /c /D "UNICODE" /EHsc winapp.c

显示如下,警告可以不管,而且没其他信息,即编译成功

文件夹中多了个.obj文件

3.连接Windows API程序

打开Windows API程序,点击【项目】→【属性】

在属性页中选择【链接器】→【输入】,双击【依赖项】并将其复制下来

复制下来的依赖项:

kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies)

执行link命令
(将“;”换成空格,并将最后的“%(AdditionalDependencies)”删去)

link winapp.obj kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib

显示如下即为连接成功

并在文件夹中生成了一个新的.exe文件

三、编译连接MFC程序

1.设置环境变量

同样的,右键【此电脑】,打开【高级系统设置】→【高级】→【环境变量】
将以下路径添加到INCLUDE中

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\include

将以下路径添加到LIB中

C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\VC\Tools\MSVC\14.16.27023\atlmfc\lib\x64

2.编译MFC程序

新建一个MFC程序,将其命名为MFCapp2,在MFCapp的基础上,在末尾处加上下列代码

extern int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow);extern "C" int WINAPI
_tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow)
#pragma warning(suppress: 4985)
{// call shared/exported WinMainreturn AfxWinMain(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
}int AFXAPI AfxWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,_In_ LPTSTR lpCmdLine, int nCmdShow)
{ASSERT(hPrevInstance == NULL);int nReturnCode = -1;CWinThread* pThread = AfxGetThread();CWinApp* pApp = AfxGetApp();// AFX internal initializationif (!AfxWinInit(hInstance, hPrevInstance, lpCmdLine, nCmdShow))goto InitFailure;// App global initializations (rare)if (pApp != NULL && !pApp->InitApplication())goto InitFailure;// Perform specific initializationsif (!pThread->InitInstance()){if (pThread->m_pMainWnd != NULL){TRACE(traceAppMsg, 0, "Warning: Destroying non-NULL m_pMainWnd\n");pThread->m_pMainWnd->DestroyWindow();}nReturnCode = pThread->ExitInstance();goto InitFailure;}nReturnCode = pThread->Run();InitFailure:
#ifdef _DEBUG// Check for missing AfxLockTempMap callsif (AfxGetModuleThreadState()->m_nTempMapLock != 0){TRACE(traceAppMsg, 0, "Warning: Temp map lock count non-zero (%ld).\n",AfxGetModuleThreadState()->m_nTempMapLock);}AfxLockTempMaps();AfxUnlockTempMaps(-1);
#endifAfxWinTerm();return nReturnCode;
}

在MFCapp2.cpp的文件夹中打开cmd
分别输入cl命令

cl /c /D "UNICODE" /EHsc MFCapp2.cpp
cl /c /D "UNICODE" /EHsc pch.cpp

编译成功

生成两个.obj文件

3.连接MFC程序

输入link命令,将两个.obj文件连接起来

link MFCapp2.obj pch.obj

连接成功

生成.exe文件

四、总结

经过一天的学习感觉上cl.exe和linker.exe使用起来难度不大,但是环境变量的配置极其复杂,若是在操作过程中出现失误,纠错起来很困难,而且不同的设备遇到任何问题都是不奇怪的,需要上网查阅许多资料来慢慢解决。

五、参考

Windows API和MFC的区别
一个最简单的MFC程序
如何使用cl.exe和linker.exe编译链接Windows API程序和MFC程序
Windows API和MFC的区别

【网络通信】简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用相关推荐

  1. 使用cobra创建cli命令行工具

    什么是cobra? Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序. Cobra是一个库,提供了一个简单的界面来创建类似于git&go工具的强大的现代 ...

  2. 在vc6控制台程序中如何调用运行ImageMagick命令行工具

    在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static ...

  3. 图解修改Windows启动菜单命令行工具BCDEdit

    一 BCDEdit命令操作实例 二 BCDEdit命令介绍 Bcdedit简介 在NT60系列操作系统(Windows 7/Vista/2008)中的一个命令行工具,用于建立和重新配置bootload ...

  4. windows命令行工具

    windows命令行工具(转)[@more@] accwiz.exe > Accessibility Wizard for walking you through setting up your ...

  5. windows命令行工具(转)

    windows命令行工具(转)[@more@]accwiz.exe > Accessibility Wizard for walking you through setting up your ...

  6. PowerCMD——cmd的命令行工具

    对于搞后端的程序猿而言,命令行工具基本上是必不可少的.一直觉得win自带的cmd和linux下的shell一比就如同渣渣一般,如果你也有同感,可以参考这一篇,把这个神器也架上 ^ ^ http://w ...

  7. openshift命令_使用命令行工具创建WildFly OpenShift应用程序

    openshift命令 通过使用快速入门,可以轻松地在OpenShift上配置WildFly的新实例. 只需单击一下,您就可以准备就绪! 通常,OpenShift的高级用户使用命令行工具 . 但是,您 ...

  8. 使用命令行工具创建WildFly OpenShift应用程序

    通过使用快速入门,可以在OpenShift上轻松配置WildFly的新实例. 只需单击一下,您就可以准备就绪! 通常,OpenShift的高级用户使用命令行工具 . 但是,您无法使用CLI工具创建Wi ...

  9. GitHub日收12000星,微软新命令行工具引爆程序员圈!

    作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 继上次微软开源计算器刷爆GitHub后,今天凌晨在微软Build大会登场的Windows Terminal,如旋风般目前已登顶GitHu ...

最新文章

  1. 在php中存redis数据,redis缓存都存哪些数据
  2. 《移动App测试的22条军规》—第1章1.2节移动App的生命周期
  3. 2能不用cuda_农村建房的新方法,只需要一块地,2天就建好房子,不用还能搬走...
  4. vs2017 linux工程设置头文件,使用Visual Studio 2017作为Linux C++开发工具
  5. python 搜索功能,使用Python使用网站的搜索功能
  6. ES9新特性_ES9扩展运算符与rest参数---JavaScript_ECMAScript_ES6-ES11新特性工作笔记053
  7. 安全强化你的 Linux 服务器的七个步骤
  8. mysql innobackupex 备份及恢复
  9. amCharts: JavaScript/HTML5 charts 破解
  10. STM32——EMWIN位图显示(四)
  11. html转word 图片格式,html转word处理图片 java
  12. mysql 分组去重只保留最新创建时间的数据
  13. 用Java实现成绩等级划分
  14. php中的where用法,ThinkPHP中where()使用方法详解
  15. 卷入亿万骗局,他遭遇“死亡威胁”:如果没有光明,我愿成为火炬
  16. Intouch与S7-200smart通讯
  17. Android开发交流群
  18. Lora SX1268使用
  19. 【大厂面试】面试官看了赞不绝口的Redis笔记
  20. PTA 《C语言程序设计(第四版)》 第五章习题【记录】

热门文章

  1. 惠普战66五代和2022款联想小新air15选哪个好
  2. 提升技术认知,光闷头写代码,是远远不够的。
  3. 辽宁琢一文化传媒有限公司
  4. Rackspace开设英国最环保数据中心
  5. 传输门、D 锁存器、D触发器、建立时间与保持时间
  6. 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)
  7. 转载---How To Set Up A USB-Over-IP Server And Client With Ubuntu 10.04
  8. 二维码溯源防伪系统,3大痛点戳中传统溯源“死穴”
  9. 有限长序列的z变换收敛域_求出以下序列的Z变换及收敛域
  10. html简单组件(五):点击旋转箭头