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. AngularJS中的DI

    AngularJS中的DI一直以为Angular中的DI是很高大上的东西,也自己写过一个DI的demo,知道其中的难点就是最后动态代码的执行:我现在知道了参数的值,也知道了我要执行的方法/创建对象的类 ...

  2. ObservableCollection 分组后排序报错问题

    ObservableCollection通过Move方法可以移动顺序,如下: 将ObservableCollection中的一个item置顶: private ObservableCollection ...

  3. hibernate查询的方式和变量

    1.实体查询: hql="FROM User"; List list= session.createQuery(hql).list(); for(Object obj:list){ ...

  4. URAL 2018 The Debut Album (DP)

    题意:给出n长度的数列,其实1的连续个数不超过a,2的连续个数不超过b. 析:dp[i][j][k] 表示前 i 个数,以 j 结尾,并且连续了k个长度,要用滚动数组,要不然MLE. 代码如下: #p ...

  5. Good Bye 2014 B. New Year Permutation(floyd )

    题目链接 题意:给n个数,要求这n个数字小的尽量放到前面,求一个最小的. 给一个矩阵s[i][j]==1,表示位置 i 的数字可以和 位置 j 的数字交换. 分析: 刚开始用的是3个循环,每次都找一个 ...

  6. 给WPF的MessageBox启用视觉样式

    WPF的MessageBox为什么会这样 我的一个同学跟我说:“WPF不是新一代技术吗?怎么连MessageBox都没WinForm 的好看?” 上图是Windows Forms 的MesssageB ...

  7. RedisUtil(未完,持续更新中....)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  8. 前端编码规范 -- html篇

    文档类型 推荐使用 HTML5 的文档类型申明: <!DOCTYPE html> (建议使用 text/html 格式的 HTML.避免使用 XHTML.XHTML 以及它的属性,比如 a ...

  9. php 获取当前的访问的ip

    <?php function get_client_ip() { $ip = $_SERVER['REMOTE_ADDR']; if (isset($_SERVER['HTTP_CLIENT_I ...

  10. 2017-10-26 NOIP模拟赛2

    财富 (treasure) Time Limit:1000ms   Memory Limit:128MB 题目描述 LYK有n个小伙伴.每个小伙伴有一个身高hi. 这个游戏是这样的,LYK生活的环境是 ...