1 多字节字符

ASCII码表:0 ~ 2^7-1

扩展ASCII码表:2^7 ~ 2^8-1

什么是GB2312:1980年,两个字节存储一个汉字;不通用,别国会有乱码。

UCICODE:只有一个字符集;每个字符都是16位宽。

2 C语言中的宽字符

2.1 宽字符的使用

"中"字的编码:

ASCII:d6 d0

UNICODE:4e 2d

char x = '中';   //汇编代码中出现的是d0
wchar_t x1 = '中'; //汇编代码中出现的是d0 d6
wchar_t x1 = L'中'; //告诉编译器我们要使用的是Unicode的那张表; 汇编代码4e 2d

2.2 宽字符串的使用

char x[] = "中国";
//d6 d0 b9 fa 00 使用拓展ASCII编码表 以00(\0)结尾 wchar_t x1[] = L"中国";
//2d 4e fd 56 00 00 使用UNICODE编码表 以00 00(\0\0)结尾

2.3 在控制台打印

char x[] = "中国";
wchar_t x1[] = L"中国";
printf("%s\n",x); //使用控制台默认的编码
wprintf(L"%s\n",x1); //默认使用英文 告诉编译器,使用控制台默认的编码格式
(1) 包含头文件 #include <locale.h>
(2) setlocale(LC_ALL,""); //使用控制台默认的编码

2.4 字符串长度(头文件:#include<string.h>)

char x[] = "中国";
wchar_t x1[] = L"中国"; strlen(x); //取得多字节字符串中字符长度,不包含 00
wcslen(x1); //取得多字节字符串中字符长度,不包含 00 00

2.5 字符串复制

char x[] = "china";
char x1[] = "123"; strcpy(x,x1); wchar_t y[] = L"中国";
wchar_t y1[] = L"好"; wcscpy(y,y1);

C语言中的宽字符和多字符

char		wchar_t		//多字节字符类型   宽字符类型

printf		wprintf		//打印到控制台函数

strlen		wcslen		//获取长度

strcpy		wcscpy		//字符串复制

strcat		wcscat		//字符串拼接

strcmp		wcscmp		//字符串比较

strstr		wcsstr		//字符串查找

3 Win32 API中的宽字符

3.1 什么是Win32 API?有哪些?在哪里?

主要是存放在 C:\WINDOWS\system32 下面所有的dll

3.2 非常重要的几个DLL

Kernel32.dll:最核心的功能模块,比如管理内存、进程和线程相关的函数等.

User32.dll:是Windows用户界面相关应用程序接口,如创建窗口和发送消息等.

GDI32.dll:全称是Graphical Device Interface(图形设备接口),包含用于画图和显示文本的函数

比如要显示一个程序窗口,就调用了其中的函数来画这个窗口

3.3 Win32 API中的宽字符和多字节字符

Windows是使用C语言开发的,Win32 API同时支持宽字符与多字节字符.

(1) 字符类型 (2) 字符串指针
char CHAR PSTR(LPSTR) 指向多字节字符串
wchar_t WCHAR PWSTR(LPWSTR) 指向宽字符串
宏 TCHAR 宏 PTSTR(LPTSTR)

字符数组赋值

CHAR cha[] = "中国";
WCHAR chw[] = L"中国";
TCHAR cht[] = TEXT("中国");

为字符串指针赋值:

PSTR pszChar = "china";				//多字节字符
PWSTR pszWChar = L"china"; //宽字符
PTSTR pszTChar = TEXT("china"); //如果项目是ASCII的 相当于"china" UNICODE 相当于L"china"

3.4 各种版本的MessageBox

MessageBoxA(0,"内容多字节","标题",MB_OK);
MessageBoxW(0,L"内容宽字节",L"标题",MB_OK);
MessageBox(0,TEXT("根据项目字符集决定"),TEXT("标题"),MB_OK);

Windows提供的API 凡是需要传递字符串参数的函数,都会提供两个版本和一个宏.

4 Win32的入口程序

int CALLBACK WinMain(
_In_ HINSTANCE hInstance,
_In_ HINSTANCE hPrevInstance,
_In_ LPSTR lpCmdLine,
_In_ int nCmdShow
)
{ return 0;
}

参数:

hInstance:

表示该程序当前运行的实例句柄,是一个数值标识。当程序在Windows下运行时,它唯一标识运行中的实例(注意,只有运行中的程序实例,才有实例句柄)。一个应用程序可以运行多个实例,每运行一个实例,系统都会给该实例分配一个实例句柄,并通过hInstance参数传递给WinMain函数。

hPrevInstance:

表示当前实例的前一个实例的句柄。通过查看MSDN我们可以知道,在Win32环境下,这个参数总是NULL,即在Win32环境下,这个参数不再起作用。

lpCmdLine:

是一个以空字符结尾的字符串,内容为命令行的参数。

nCmdShow:

指定程序的窗口应该如何显示,例如最大化、最小化、隐藏等。这个参数的值由该程序的调用者所指定,应用程序通常不需要去理会这个参数的值。

5 在Win32程序中打印信息

.h

void __cdecl OutputDebugStringF(const char *format, ...); 

#ifdef _DEBUG
#define DbgPrintf OutputDebugStringF
#else
#define DbgPrintf
#endif .cpp void __cdecl OutputDebugStringF(const char *format, ...)
{
va_list vlArgs;
char *strBuffer = (char*)GlobalAlloc(GPTR, 4096); va_start(vlArgs, format);
_vsnprintf(strBuffer, 4096 - 1, format, vlArgs);
va_end(vlArgs);
strcat(strBuffer, "\n");
OutputDebugStringA(strBuffer);
GlobalFree(strBuffer);
return;
}

以后调试win32程序,同样可以使用DbgPrintf()函数来打印测试信息。

6 GetLastError的使用

TCHAR szContent[] = TEXT("内容");

TCHAR szTitle[] = TEXT("标题");

MessageBox((HWND)0,szContent,szTitle,MB_OK);

DWORD errorCode = GetLastError();

可以查看errorCode中的值,查到错误原因(在msdn中查)

零基础逆向工程27_Win32_01_宽字符_MessageBox_win32调试输出的更多相关文章

  1. 零基础逆向工程20_PE结构04_任意节空白区_新增节_扩大节添加代码

    向代码节添加代码实现 作者经过一周不断的失败,再思考以及无数次调试终于实现. 思路:八个步骤 1. 文件拷到文件缓冲区(FileBuffer) //图示见(零基础逆向工程18之PE加载过程) 2. 文 ...

  2. 零基础逆向工程33_Win32_07_创建线程

    1 什么是线程(Threads)? 什么是多线程? 怎么在windows中观察多线程? 线程可以简单理解为主程序为解决一个问题而选择的其中一条路线. 同理,多线程就是同时选择不同的路线来解决此问题. ...

  3. 零基础逆向工程21_PE结构05_数据目录表_导出表

    数据目录 1.我们所了解的PE分为头和节,在每个节中,都包含了我们写的一些代码和数据,但还有一些非常重要 的信息是编译器替我们加到PE文件中的,这些信息可能存在在任何可以利用的地方. 2.这些信息之所 ...

  4. 零基础逆向工程16_C语言10_宏定义_头文件_内存分配_文件读写

    #define 无参数的宏定义的一般形式为:#define 标识符 字符序列 如:#define TRUE 1 注意事项: 1.之作字符序列的替换工作,不作任何语法的检查 2.如果宏定义不当,错误要到 ...

  5. 零基础逆向工程40_Win32_14_枚举窗口_模拟鼠标键盘

    1 查找窗口 1.1 代码案例 //查找指定窗口 TCHAR szTitle[MAX_PATH] = {0}; HWND hwnd = ::FindWindow(TEXT("#32770&q ...

  6. 零基础逆向工程39_Win32_13_进程创建_句柄表_挂起方式创建进程

    1 进程的创建过程 打开系统 --> 双击要运行的程序 --> EXE开始执行 步骤一: 当系统启动后,创建一个进程:Explorer.exe(也就是桌面进程) 步骤二: 当用户双击某一个 ...

  7. 零基础逆向工程38_Win32_12_信号量_线程控制小结

    1 信号量 信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施,是可以用来保证两个或多个关键代码段不被并发调用.[百度百科] 1.1 创建信号量 HANDLE Create ...

  8. 零基础逆向工程37_Win32_11_事件_线程同步

    1 内核对象 前面已经学过线程和互斥体两个内核对象.此节讲了事件这个内核对象.前面提出了内核对象这个概念,可能不太清晰,简单来说内核对象就是系统层的东西. 1.1 小结内核对象: 进程.线程.事件.互 ...

  9. 零基础逆向工程36_Win32_10_互斥体_互斥体与临界区的区别

    1 引言 讲了第二个内核对象,互斥体.前面已经学过一个内核对象,线程.这节讲两个函数,WaitForSingleObject()和WaitForMultipleObjects().因此这两个函数是根据 ...

随机推荐

  1. 利用Admin-LTE项目搭建自己前端的开发框架模板

    1 完整版本 1.1 下载admin-lte项目源代码 github下载地址:点击前往 三少云盘地址:点击前往 1.2 查看admin-lte精简主页源代码 页面地址:点击前往 注意:由源代码可以知道 ...

  2. 5、bam格式转为bigwig格式

    1.Bam2bigwig(工具) https://www.researchgate.net/publication/301292288_Bam2bigwig_a_tool_to_convert_bam ...

  3. Session和cookie有什么区别?

    cookie是保存在客户端的信息,它只能保存String类型的,没有session安全,如果客户端禁用了cookie就不能够使用了 Cookie是客户端技术,程序把每个用户的数据以cookie的形式写 ...

  4. 初识Composer

    关于vendor name和project name的区别? 包名(package name)包含了供应商名(vendor name)和项目名(project name)是为了避免命名冲突的 requ ...

  5. Codeforces - 102222C - Caesar Cipher

    https://codeforc.es/gym/102222/my 好像在哪里见过这个东西?字符的左右移还是小心,注意在mod26范围内. #include<bits/stdc++.h> ...

  6. 初等变换求 |A| % Mod & A- % Mod & A* % Mod(模板)

    // |A| * A- = A* (伴随矩阵) = 逆矩阵 * 矩阵的值 #include<cstdio> #include<cstring> #include<cstd ...

  7. 洛谷P2607 [ZJOI2008]骑士

    P2607 [ZJOI2008]骑士 题目描述 Z国的骑士团是一个很有势力的组织,帮会中汇聚了来自各地的精英.他们劫富济贫,惩恶扬善,受到社会各界的赞扬. 最近发生了一件可怕的事情,邪恶的Y国发动了一 ...

  8. bzoj2724: [Violet 6]蒲公英(分块)

    传送门 md调了一个晚上最后发现竟然是空间开小了……明明算出来够的…… 讲真其实我以前不太瞧得起分块,觉得这种基于暴力的数据结构一点美感都没有.然而今天做了这道分块的题才发现分块的暴力之美(如果我空间 ...

  9. [Xcode 实际操作]四、常用控件-(17)为MKMapView地图上显示提示框

    目录:[Swift]Xcode实际操作 本文将演示当点击地图上的标注圆点时,弹出信息窗口. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit ...

  10. vue的预渲染--seo

    项目用的是vue,spa,用这个很简单,但是头疼的是重要的seo优化.第一反应是服务器端渲染,但是个人搞了半天后感觉有点难,在项目时间有限的情况下,只能寻找另外的方法,把这个留给项目后在研究. 先用v ...