【网络通信】简易MFC程序的创建与命令行工具cl.exe、linker.exe的使用
简易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的使用相关推荐
- 使用cobra创建cli命令行工具
什么是cobra? Cobra既是用于创建强大的现代CLI应用程序的库,也是用于生成应用程序和命令文件的程序. Cobra是一个库,提供了一个简单的界面来创建类似于git&go工具的强大的现代 ...
- 在vc6控制台程序中如何调用运行ImageMagick命令行工具
在http://www.imagemagick.org/script/index.php网站下载相应的执行文件,这里以下载ImageMagick-6.6.5-10-Q16-windows-static ...
- 图解修改Windows启动菜单命令行工具BCDEdit
一 BCDEdit命令操作实例 二 BCDEdit命令介绍 Bcdedit简介 在NT60系列操作系统(Windows 7/Vista/2008)中的一个命令行工具,用于建立和重新配置bootload ...
- windows命令行工具
windows命令行工具(转)[@more@] accwiz.exe > Accessibility Wizard for walking you through setting up your ...
- windows命令行工具(转)
windows命令行工具(转)[@more@]accwiz.exe > Accessibility Wizard for walking you through setting up your ...
- PowerCMD——cmd的命令行工具
对于搞后端的程序猿而言,命令行工具基本上是必不可少的.一直觉得win自带的cmd和linux下的shell一比就如同渣渣一般,如果你也有同感,可以参考这一篇,把这个神器也架上 ^ ^ http://w ...
- openshift命令_使用命令行工具创建WildFly OpenShift应用程序
openshift命令 通过使用快速入门,可以轻松地在OpenShift上配置WildFly的新实例. 只需单击一下,您就可以准备就绪! 通常,OpenShift的高级用户使用命令行工具 . 但是,您 ...
- 使用命令行工具创建WildFly OpenShift应用程序
通过使用快速入门,可以在OpenShift上轻松配置WildFly的新实例. 只需单击一下,您就可以准备就绪! 通常,OpenShift的高级用户使用命令行工具 . 但是,您无法使用CLI工具创建Wi ...
- GitHub日收12000星,微软新命令行工具引爆程序员圈!
作者 | 伍杏玲 出品 | CSDN(ID:CSDNnews) 继上次微软开源计算器刷爆GitHub后,今天凌晨在微软Build大会登场的Windows Terminal,如旋风般目前已登顶GitHu ...
最新文章
- 在php中存redis数据,redis缓存都存哪些数据
- 《移动App测试的22条军规》—第1章1.2节移动App的生命周期
- 2能不用cuda_农村建房的新方法,只需要一块地,2天就建好房子,不用还能搬走...
- vs2017 linux工程设置头文件,使用Visual Studio 2017作为Linux C++开发工具
- python 搜索功能,使用Python使用网站的搜索功能
- ES9新特性_ES9扩展运算符与rest参数---JavaScript_ECMAScript_ES6-ES11新特性工作笔记053
- 安全强化你的 Linux 服务器的七个步骤
- mysql innobackupex 备份及恢复
- amCharts: JavaScript/HTML5 charts 破解
- STM32——EMWIN位图显示(四)
- html转word 图片格式,html转word处理图片 java
- mysql 分组去重只保留最新创建时间的数据
- 用Java实现成绩等级划分
- php中的where用法,ThinkPHP中where()使用方法详解
- 卷入亿万骗局,他遭遇“死亡威胁”:如果没有光明,我愿成为火炬
- Intouch与S7-200smart通讯
- Android开发交流群
- Lora SX1268使用
- 【大厂面试】面试官看了赞不绝口的Redis笔记
- PTA 《C语言程序设计(第四版)》 第五章习题【记录】
热门文章
- 惠普战66五代和2022款联想小新air15选哪个好
- 提升技术认知,光闷头写代码,是远远不够的。
- 辽宁琢一文化传媒有限公司
- Rackspace开设英国最环保数据中心
- 传输门、D 锁存器、D触发器、建立时间与保持时间
- 分频器——(任意奇分频(50%占空比、非50%占空比),任意偶分频,任意小数分频)
- 转载---How To Set Up A USB-Over-IP Server And Client With Ubuntu 10.04
- 二维码溯源防伪系统,3大痛点戳中传统溯源“死穴”
- 有限长序列的z变换收敛域_求出以下序列的Z变换及收敛域
- html简单组件(五):点击旋转箭头