win_c/c++ mess01
2020-01-04 本文已影响0人
Ewitter
1. win makefile
1.1 win makefile,eg:
# Nmake macros for building Windows 32-Bit apps
!include <Win33.Mak>
OUTDIR = START_BIN
# ---------Build Rule-------
all: $(OUTDIR) $(OUTDIR)\start.exe
# if OUTDIR does not exist,then create
$(OUTDIR):
if not exist "$(OUTDIR)/$(NULL)" mkdir $(OUTDIR)
# ----------compile----------
$(OUTDIR)\start.obj: start.c
cl -c -DCRTAPIl=_cdecl -DCRTAPI2=_cdecl -nologo -GS -D_X86_=1 -DWIN32 -D_WIN32 -W3
-D_WINNT -D_WIN32_WINNT=0x0500 0D)WIN32)IE=0x0500 -DWINVER=0x0500
-D_MT -MTd /Gz /Fo"$(OUTDIR)\\" /Fd"$(OUTDIR)\\" start.c
# ------------link-----------
$(OUTDIR)\start.exe: $(OUTDIR)\start.obj
link /INCREMENTAL:NO /NOLOGO -subsystem:windows,5.0 -out:$(OUTDIR)\start.exe
$(OUTDIR)\start.obj kernel33.lib ws2_33.lib mswsock.lib advapi33.lib bufferoverflowu.lib
#-------------clean Rule------
clean:
if exist $(OUTDIR) rd /s /q $(OUTDIR)
1.2 makefile explain:
预处理 !include <Win33.Mak>
注释 #
宏(例子中的 OUTDIR) 宏定义直接使用“=”,“=”前为 宏名,其后为 宏值
宏引用 $(macro_name)
nmake命令参数:
NMAKE [option] [/f makefile] [/x stderrfile] [macrodefs] [targets]
[targets]指 目标,默认是 makefile中的第一个目标;
用/f 指定makefile的名字,默认是当前目录下文件名为makefile的文件。
nmake时间戳 判断机制:
生成一个目标时,若所有依赖项的最后修改时间早于目标的最后修改时间,则没必要再生成。
特殊宏:
S@ 当前目标的全名(全路径)
SS@ 当前目标的全名(全路径),作为依赖项
S* 除去文件扩展名的当前目标的全名
S** 当前目标的所有依赖项
S? 时间戳晚于当前目标时间戳的所有依赖项
S< 时间戳晚于当前目标时间戳的所有依赖项,在推理规则的命令中有效
MAKE 调用NMAKE
MAKEDIR 调用NMAKE时的当前目录
MAKEFLAGS 当前有效的选项(去掉/F),eg: /$(MAKEFLAGS)
2. tool tips
2.1 VS-tool:
alt + -> 代码提示
F5 开始调试
shift+ F5 结束调试
F7 build
F9 设置/取消breakpoint
F10 debug模式下 单步执行
F11 debug模式下 步入函数
F12 转到定义
ctrl+ G 转到行
ctrl+ W 选中单词
ctrl+ T 前后交换
ctrl+ U 转为小写
ctrl+ shift + U 转为大写
ctrl+ K 然后ctrl+ C 注释所在行
ctrl+ K 然后ctrl+ F 整理代码格式
ctrl+ F / ctrl+ N 查找/新建
其他快捷键设置(工具-选项-环境-键盘)
生成项目:(或将项目生成为一个 可执行文件或者动态链接库)
生成解决方案:生成-生成解决方案,或 解决方案管理器 右键单击 解决方案名;
生成单个项目菜单:生成-生成项目名称,或 解决方案管理器 右键单击 解决方案名;
若生成出错,可查看错误列表:视图-其他窗口-错误列表。
eg:
在“C/C++”子选项下的“代码生成”选项页中,“运行时库”选项下,/MD( Release)选项或/MDd( Debug)选项。
使用这两个选项编程,将会调用一些系统中原本并不存在的接口。要解决这个问题需将选项改为/MT。
如果新建 C/C++项目时选择“常规” → “空项目”,在运行时库时使用的选项就是/MT(这也是
cl.exe 的默认选项)。
建议:在编写 Windows 本机(Native)应用程序时,建议建立工程时选择“空项
目”,这样编译连接选项大多都是默认的
2.2 WinDbg command(more info press F1)
d:查看内存数据
l:列出进程信息
Im:查看已加载模块
g:运行
ld:加载符号文件
r:查看寄存器
bp、bu、bm: 下载断点,bp为执行断点,bu为未解析断点,bm为符号断点
bl:列出断点
bc:清除断点
2.3 vc6
alt + F8 代码对齐
3. unicode & prefix
3.1 关于UNICODE
_UNICODE defined _UNICODE not defined
#define _tcslen wcslen #define _tcslen strlen
typedef wchar_t TCHAR typedef char TCHAR
#define __T(x) L##x #define __T(x) x
#define MessageBox MessageBoxW #define MessageBox MessageBoxA
#define _T(x) __T(x)
#define _TEXT(x) __T(x)
eg: if macro parameter is ""Hello"", then L##x is L""Hello"""
3.2 前缀 含义
Prefix Constant
CS Class style option
CW Create window option
DT Draw text option
IDI ID number for an icon
IDC ID number for a cursor
MB Message box option
SND Sound option
WM Window message
WS Window style
3.3 Suggested variable name prefix
prefix Data Type
c char/WCHAR/TCHAR
by BYTE(unsigned char)
n short
i int
x/y int used as x/y-coordinate
cx/cy int used as x/y length;c stands for "count"
b/f BOOL(int); f stands for "flag"
w WORD(unsigned short)
l LONG(long)
dw DWORD(unsigned long)
fn function
s string
sz string terminated by 0 character
h handle
p point