编译器CL.EXE,将源码编译成目标代码.obj
链接器LINK.EXE,将目标代码、库链接生成最终文件
资源编译器RC.EXE,(.rc)将资源编译,最终通过链接器存入最终文件
工具所在路径:C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
注意:将上面文件夹中的vcvars32.bat
文件拷贝到项目的所在目录下,要不然使用不了上面的工具进行操作
Windows库
kernel32.dll
:提供了核心的API,例如进程、线程、内存管理user32.dll
:提供了窗口、消息等APIgdi32.dll
:绘图相关的APIC:\Windows\System32
头文件
windows.h
:所有windows头文件的集合windef.h
:windows数据类型winbase.h
:kernel32的APIwingdi.h
:gdi32的APIwinuser.h
:user32的APIwinnt.h
:UNICODE字符集支持C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Include
int WINAPI WinMain(
HINSTANCE hInstance,//当前程序的实例句柄
HINSTANCE hPrevInstance,//当前程序前一个实例句柄
LPSTR lpCmdLine,//命令行参数字符串
int nCmdShow//窗口的显示方式
);
int MessageBox(
HWND hWnd,//父窗口句柄
LPCTSTR lpText,//显示在信息框中的文字
LPCTSTR lpCaption,//显示在信息框中的文字
UINT uType//消息框中的按钮、图标显示类型
);//返回点击的按钮ID
vcvars32.bat
CL
CL.EXE -c xxx.c
LINK
LINK.EXE xxx.obj xxx.lib
int WinMain(HINSTANCE hIns,HINSTANCE hPreIns,LPSTR lpCmdLine,int nCmdShow)
{
MessageBox(NULL, "hello world", "infomation", MB_YESNOCANCEL|MB_ICONERROR);
return 0;
}
Hello.txt
变为Hello.c
vcvars32.bat
文件.rc
资源脚本文件RC.EXE
LINK.EXE
#include
//窗口处理函数(自定义,处理函数)
LRESULT CALLBACK WndProc(HWND hWnd,UINT msgID,WPARAM wParam,LPARAM lParam)
{
return DefWindowProc(hWnd, msgID, wParam, lParam);
}
//入口函数
int CALLBACK WinMain(HINSTANCE hIns, HINSTANCE hPreIns,LPSTR lpCmdLine,int nCmdShow)
{
//注册窗口类
WNDCLASS wc = {0};
wc.cbClsExtra = 0;
wc.cbWndExtra = 0;
wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
wc.hCursor = NULL;
wc.hIcon = NULL;
wc.hInstance = hIns;
wc.lpfnWndProc = WndProc;
wc.lpszClassName = "Main";
wc.lpszMenuName = NULL;
wc.style = CS_HREDRAW|CS_VREDRAW;
RegisterClass(&wc);//将以上所有赋值全部写入操作系统
//在内存创建窗口
HWND hWnd = CreateWindow("Main","window",WS_OVERLAPPEDWINDOW,100,100,500,500,NULL,NULL,hIns,NULL);
//显示窗口
ShowWindow(hWnd,SW_SHOW);
UpdateWindow(hWnd);
//消息循环
MSG nMsg = {0};
while(GetMessage(&nMsg,NULL,0,0))
{
TranslateMessage(&nMsg);
DispatchMessage(&nMsg);//将消息交给窗口处理函数来处理
}
return 0;
}
A 我 是 程 序 员
01 0203 0405 0607 0809 0A0B
但是解析时可能是
01 0203 0405 0607 0809 0A0B
0102 0304 0506 0708 090A 0B
A 我 是 程 序 员
01 0203 0405 0607 0809 0A0B
不存在解析的问题
wchar_t
每个字符占2个字节char
每个字符占1个字节w_char_t
实际是unsigned short
类型,定义时需增加"L"
,通知编译器按照双字节编码字符串,采用UNICODE编码wchar_t
函数操作宽字节字符串,例如:wchar_t* pwszText = L"Hello world";
wprintf(L"%s\n", pwszText);
#include
#include
void C_char(){
char* pszText = "Hello char";
printf("%s\n", pszText);
}
void W_char(){
wchar_t* pszText = L"hello wchar";
int len = wcslen(pszText);
wprintf(L"%s %d\n", pszText, len);
}
int main(){
C_char();
W_char();
getchar();
return 0;
}
#ifdef UNICODE
typedef wchar_t TCHAR;
# define __TEXT(quote)L##quote
#else
typedef char TCHAR;
#define __TEXT(quote)quote
#endif
#define UNICODE
#include
#include
void C_char(){
char* pszText = "Hello char";
printf("%s\n", pszText);
}
void W_char(){
wchar_t* pszText = L"hello wchar";
int len = wcslen(pszText);
wprintf(L"%s %d\n", pszText, len);
}
void T_char(){
TCHAR* pszText = __TEXT("hello txt");//char* pszText = "Hello txt";/wchar_t* pszText = L"hello txt";
#ifdef UNICODE
wprintf(L"%s\n", pszText);
#else
printf("single:%s\n", pszText);
#endif
}
int main(){
C_char();
W_char();
T_char();
getchar();
return 0;
}
wprintf
对UNICODE字符打印支持不完善,在Windows下使用WriteConsole
API打印UNICODE字符GetStdHandle
#define UNICODE
#include
#include
void C_char(){
char* pszText = "Hello char";
printf("%s\n", pszText);
}
void W_char(){
wchar_t* pszText = L"hello wchar";
int len = wcslen(pszText);
wprintf(L"%s %d\n", pszText, len);
}
void T_char(){
TCHAR* pszText = __TEXT("hello txt");//char* pszText = "Hello txt";/wchar_t* pszText = L"hello txt";
#ifdef UNICODE
wprintf(L"%s\n", pszText);
#else
printf("single:%s\n", pszText);
#endif
}
void printUnicode(){
wchar_t* pszText = L"今天在下雨";
//wprintf(L"%s\n", pszText);//打印出来的是乱码
//获取标准输出句柄
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsole(hOut,pszText, wcslen(pszText), NULL, NULL);
}
int main(){
C_char();
W_char();
T_char();
printUnicode();
getchar();
return 0;
}