静态库程序:扩展名LIB,在编译链接程序时,将代码放入到执行文件中
动态库程序:扩展名DLL,在执行文件执行时从中获取代码。
此处的Debug放的所有项目最终文件
此处Debug放的是中间文件’
早在VS2017开始,stdafx.h改名为pch.h
之前的版本:
Windows库
kernel32.dll -提供了核心的API,例如进程,线程,内存管理等
user32.dll -提供了窗口,消息等API
gdi32.dll -绘图相关的API
存放路径:C:\Windows\System32
头文件
windows.h -所有windows头文件的集合
windef.h -windows数据类型
winbase.h -kernel32的API
wingdi.h -gdi32的API
winuser.h -user32的API
winnt.h -UNICODE字符集支持
存放路径:C:\Program Files (x86)\Windows Kits\10\Include\10.0.19041.0\um
windows.h包含下面所有:
int WINAPI WinMain(
//句柄是用来找到内存的东西,但不是指针
HINSTANCE hInstance, //当前程序的实例句柄, 找到当前进程的内存
HINSTANCE hPrevInstance, //当前程序前一个实例句柄
LPSTR lpCmdLIne, //命令行参数字符串
int nCmdShow //窗口的显示方式
);
int MessageBox(
HWND hWnd,//父窗口句柄,没有,为null
LPCTSTR lpText, //显示在消息框中的文字
LPCTSTR lpCaption, //显示在标题栏中的文字
UINT uType //消息框中的按钮,图标显示类型
);//返回点击的按钮ID
#include
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,LPSTR lpCmdLIne, int nCmdShow)
{
int nRet = MessageBox(NULL,"hello world","Information",MB_YESNOCANCEL|MB_ICONERROR);
if(nRet == IDYES){
}else if (nRet == IDNO){
}else{
}
return 0;
}
将名称改为.c
以命令行形式执行
测试CL.EXE是否当前目录可以
以上情况不可用,运行vcvars32.bat,此时命令CL.EXE可用
编译,生成.obj
链接,生成.exe
点击.exe
给上述过程加上图标:
创建hello.rc和将图标加入
写脚本语言
编译
链接,图标也改成small.ico的
WinBase.cpp:
#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;
}
WinChar.cpp:
#include
#include
void C_char()
{
char s[] = "hello char";
char* pszText =s;
printf("%s\n", pszText);//strlen
}
void W_char()
{
wchar_t s1[] = L"hello wchar";
wchar_t* pszText = s1;
int len = wcslen(pszText);
wprintf(L"%s %d\n", pszText,len);//strlen
}
int main()
{
C_char();
W_char();
getchar();
return 0;
}
TCHAR兼容wchar_t和char
#ifdef UNICODE
typedef wchar_t TCHAR;
#define _TEXT(quote) L##quote
#else
typedef char TCHAR;
#define _TEXT(quote) quote
#endif
此时项目是多字节项目
#include
#include
void T_char()
{
const TCHAR* pszText = __TEXT("hello world");
#ifdef UNICODE
wprintf(L"%s\n", pszText);
#else
printf("单:%s\n", pszText);
#endif
}
int main()
{
T_char();
getchar();
return 0;
}
输出:
将项目改成UNICODE编码,需要在#include
#define UNICODE
#include
#include
void T_char()
{
const TCHAR* pszText = __TEXT("hello world");
#ifdef UNICODE
wprintf(L"%s\n", pszText);
#else
printf("单:%s\n", pszText);
#endif
}
int main()
{
T_char();
getchar();
return 0;
}
//#define UNICODE
#include
#include
void T_char()
{
const TCHAR* pszText = __TEXT("hello world");
#ifdef UNICODE
wprintf(L"%s\n", pszText);
#else
printf("单:%s\n", pszText);
#endif
}
int main()
{
T_char();
getchar();
return 0;
}
UNICODE字符打印
wprintf对UNICODE字符打印支持不完善
在Windows下使用WriteConsole API打印UNICODE字符GetStdHandle
void PrintUnicode()
{
wchar_t s1[] = L"为大家都大是大非方法大是大非水电费";
wchar_t* pszText = s1;
//wprintf(L"%s\n", pszText);//乱码
HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);
WriteConsole(hOut, pszText, wcslen(pszText), NULL, NULL);
}
int main()
{
PrintUnicode();
getchar();
return 0;
}
系统调用函数的参数类型
LPSTR === char* LPCSTR === const char*
LPWSTR === wchar_t* LPCWSTR === const wchar_t*
LPTSTR === TCHAR* LPCTSTR === const TCHAR*
大量系统的变量是最后一个,使用多字节字符集,字符串可以不必添加大写L