<?xml version="1.0" encoding="utf-8" ?><rss version="2.0"><channel><title><![CDATA[ShiQW5696的博客]]></title><description><![CDATA[]]></description><link>https://blog.youkuaiyun.com/ShiQW5696</link><language>zh-cn</language><generator>https://blog.youkuaiyun.com/</generator><copyright><![CDATA[Copyright &copy; ShiQW5696]]></copyright><item><title><![CDATA[Git revert 撤销合并]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/121374305</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/121374305</guid><author>ShiQW5696</author><pubDate>Wed, 17 Nov 2021 11:35:43 +0800</pubDate><description><![CDATA[Git 的 revert 命令可以用来撤销提交（commit），对于常规的提交来说，revert 命令十分直观易用，相当于做一次被 revert 的提交的「反操作」并形成一个新的 commit，但是当你需要撤销一个合并（merge）的时候，事情就变得稍微复杂了一些。

Merge Commit

在描述 merge commit 之前，先来简短地描述一下常规的 commit。每当你做了一批操作（增加、修改、或删除）之后，你执行 git commit 便会得到一个常规的 Commit。执行 git show ]]></description><category></category></item><item><title><![CDATA[彻底搞清楚javascript中的require、import和export]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/119458359</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/119458359</guid><author>ShiQW5696</author><pubDate>Fri, 06 Aug 2021 16:57:28 +0800</pubDate><description><![CDATA[为什么有模块概念

理想情况下，开发者只需要实现核心的业务逻辑，其他都可以加载别人已经写好的模块。

但是，Javascript不是一种模块化编程语言，在es6以前，它是不支持”类”（class），所以也就没有”模块”（module）了。

require时代

Javascript社区做了很多努力，在现有的运行环境中，实现”模块”的效果。

原始写法

模块就是实现特定功能的一组方法。
只要把不同的函数（以及记录状态的变量）简单地放在一起，就算是一个模块。


			1

			2

			3

			4]]></description><category></category></item><item><title><![CDATA[关于strcpy_s第二个参数（目标缓冲区大小）的测试以及更加安全的替代方案]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80676290</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80676290</guid><author>ShiQW5696</author><pubDate>Wed, 13 Jun 2018 14:52:50 +0800</pubDate><description><![CDATA[先来看一下msdn上的函数原型和对其参数的解释errno_t strcpy_s(  
   char *strDestination,  
   size_t numberOfElements,  
   const char *strSource   
); 

Parameters
strDestination
Location of the destination string buffer...]]></description><category></category></item><item><title><![CDATA[“error C2712: 无法在要求对象展开的函数中使用__try”解决方案]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80664749</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80664749</guid><author>ShiQW5696</author><pubDate>Tue, 12 Jun 2018 16:33:31 +0800</pubDate><description><![CDATA[前段时间写了一篇关于C++异常捕获及异常处理的文章：c++异常捕获及异常处理try-throw-catch严格的来说，那不算是一篇完整的文章，更多的是提出我的疑惑。顺便总结了一下网友关于C++异常捕获及异常处理给出的精炼的示例。至今，上文提到的疑惑本菜鸟都没有完全解开。于是，我就选择了用 __try __except 来捕获及处理异常。经过测试，我想捕获的异常用 __try __except 都捕...]]></description><category></category></item><item><title><![CDATA[转储了dump后，如何用Windbg进行分析呢？]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80568452</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80568452</guid><author>ShiQW5696</author><pubDate>Mon, 04 Jun 2018 15:59:17 +0800</pubDate><description><![CDATA[上一篇向大家介绍了如何在程序“死”的时候转储Dump文件以及如何进行一些其他的处理（请戳蓝色字体：《程序又“死”了，但是还好我转储了dump！》）。那么，今天笔者将继续向大家详细介绍如何使用Windbg对dump文件进行调试分析。-- 准备工作 --Windbg是一款功能十分强大的调试工具，它设计了极其丰富的功能来支持各种调试任务，包括用户态调试、内核态调试、调试转储文件、远程调试等等。 ● ST...]]></description><category></category></item><item><title><![CDATA[WinDbg命令行选项详解]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80564012</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80564012</guid><author>ShiQW5696</author><pubDate>Mon, 04 Jun 2018 10:39:14 +0800</pubDate><description><![CDATA[本文内容摘自：http://www.dbgtech.net/windbghelp/如有侵权请联系。WinDbg命令行选项WinDbg命令行使用如下语法：windbg [ -server ServerTransport | -remote ClientTransport ] [-lsrcpath ]   [ -premote SmartClientTransport ] [-?] [-ee {mas...]]></description><category></category></item><item><title><![CDATA[c++异常捕获及异常处理try-throw-catch]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80283205</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80283205</guid><author>ShiQW5696</author><pubDate>Fri, 11 May 2018 19:07:51 +0800</pubDate><description><![CDATA[一直以来，我对c++的异常捕获功能非常困惑。因为网上几乎99%的关于c++异常捕获的文章给我的感觉就是：c++异常捕获很简单的啦~就是下面这样嘛，如下情景1：try
{
    int a = 5, b = 0, c = 0;
    c = a / b;    // 这里异常
}
catch(...)        // 捕获所有异常
{
    printf_s(&quot;Do not do this...]]></description><category></category></item><item><title><![CDATA[为什么构造函数不能声明为虚函数，析构函数可以]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80185150</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80185150</guid><author>ShiQW5696</author><pubDate>Thu, 03 May 2018 19:35:04 +0800</pubDate><description><![CDATA[                构造函数不能声明为虚函数，析构函数可以声明为虚函数，而且有时是必须声明为虚函数。不建议在构造函数和析构函数里面调用虚函数。构造函数不能声明为虚函数的原因是:1 构造一个对象的时候，必须知道对象的实际类型，而虚函数行为是在运行期间确定实际类型的。而在构造一个对象时，由于对象还未构造成功。编译器无法知道对象 的实际类型，是该类本身，还是该类的一个派生类，或是更深层次的派...]]></description><category></category></item><item><title><![CDATA[C和C++结构体的区别]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80118632</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80118632</guid><author>ShiQW5696</author><pubDate>Sat, 28 Apr 2018 11:39:51 +0800</pubDate><description><![CDATA[C的结构体内不允许有函数存在，C++允许有内部成员函数，且允许该函数是虚函数。所以C的结构体是没有构造函数、析构函数、和this指针的。C的结构体对内部成员变量的访问权限只能是public，而C++允许public,protected,private三种。C语言的结构体是不可以继承的，C++的结构体是可以从其他的结构体或者类继承过来的。在C中定义一个结构体类型要用typedef，如下：typede...]]></description><category></category></item><item><title><![CDATA[MD(d)、MT(d)编译选项]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80062317</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80062317</guid><author>ShiQW5696</author><pubDate>Tue, 24 Apr 2018 11:46:26 +0800</pubDate><description><![CDATA[一、MD(d)、MT(d)编译选项的区别1、编译选项的位置以VS2005为例，这样子打开：1）         打开项目的Property Pages对话框2）         点击左侧C/C++节3）         点击Code Generation节4）         右侧第六行Runtime Library项目2、各个设置选项代表的含义编译选项包含静态链接的lib说明/MD_MT、_DL...]]></description><category></category></item><item><title><![CDATA[VMProtectSDK使用教程]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80055822</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80055822</guid><author>ShiQW5696</author><pubDate>Mon, 23 Apr 2018 20:30:43 +0800</pubDate><description><![CDATA[一．    接口说明//开始保护处标记（对应于功能设置：反调试、内存保护等等）VMProtectBegin(const char *);//开始虚拟化代码处标记（包括保护设置）VMProtectBeginVirtualization(const char *);//开始变异代码处标记（包括保护设置）VMProtectBeginMutation(const char *);//开始虚拟+代码变异标记...]]></description><category></category></item><item><title><![CDATA[C/C++调用约定__stdcall、__cdecl和__fastcall的区别]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80052011</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80052011</guid><author>ShiQW5696</author><pubDate>Mon, 23 Apr 2018 16:23:35 +0800</pubDate><description><![CDATA[__stdcall、__cdecl和__fastcall是三种函数调用协议，函数调用协议会影响函数参数的入栈方式、栈内数据的清除方式、编译器函数名的修饰规则等。如下图所示，可以在IDE环境中设定所有函数默认的调用协议，还可以在函数定义时单独设定本函数的调用协议。调用协议常用场合__stdcall：Windows API默认的函数调用协议。__cdecl：C/C++默认的函数调用协议。__fastc...]]></description><category></category></item><item><title><![CDATA[DllMain详解]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80018613</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80018613</guid><author>ShiQW5696</author><pubDate>Fri, 20 Apr 2018 14:49:04 +0800</pubDate><description><![CDATA[本文转载自：https://blog.youkuaiyun.com/benkaoya/article/details/25047811  DLL的进入/退出函数1.1  DllMain简介跟exe有个main或者WinMain入口函数一样，DLL也有一个入口函数，就是DllMain。以“DllMain”为关键字，来看看MSDN帮助文档怎么介绍这个函数的。The DllMain function is an o...]]></description><category></category></item><item><title><![CDATA[DLL的远程注入技术及注入dll函数调用]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/80005765</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/80005765</guid><author>ShiQW5696</author><pubDate>Thu, 19 Apr 2018 15:34:20 +0800</pubDate><description><![CDATA[                                                    本文转载自：https://blog.youkuaiyun.com/xuplus/article/details/36051337一、DLL注入DLL的远程注入技术是目前Win32病毒广泛使用的一种技术。使用这种技术的病毒体通常位于一个DLL中，在系统启动的时候，一个EXE程序会将这个DLL加载至某些系统进...]]></description><category></category></item><item><title><![CDATA[C++ string字符串初始化]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/79985844</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/79985844</guid><author>ShiQW5696</author><pubDate>Wed, 18 Apr 2018 11:09:33 +0800</pubDate><description><![CDATA[先来看看C的字符串是如何进行初始化的：char *cpStr=&quot;hello world&quot;;
char arr1[]=&quot;hello world&quot;;
char arr2[]={'h','e','l','l','o'};这三种定义c字符串的方式，其中前两种虽然形式不一样但含义是一摸一样的，没有差别，在计算字符长度的时候都会比实际显示的字符长度多1，因为这两种初始化会在字符串末尾默认添加了一个‘/0’。而...]]></description><category></category></item><item><title><![CDATA[使用fstream进行文件读写时如何选择文件打开方式]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/79977646</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/79977646</guid><author>ShiQW5696</author><pubDate>Tue, 17 Apr 2018 17:12:43 +0800</pubDate><description><![CDATA[一、fstream文件打开方式。      ios::in              input         以输入方式打开文件。      ios::out           output        以输出方式打开文件。      ios::app          append     以追加方式打开文件。      ios::ate           at end        ...]]></description><category></category></item><item><title><![CDATA[为什么要用大写的那些类型修饰符？如INT与int、BOOL与bool]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/79965806</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/79965806</guid><author>ShiQW5696</author><pubDate>Mon, 16 Apr 2018 20:20:36 +0800</pubDate><description><![CDATA[                            本文转载自：https://blog.youkuaiyun.com/yjn001/article/details/3761709一般的任何一个正规的项目开发第一件事情要做的就是在开发环境上架一层自己的环境，主要包括类型定义、内存管理和文件管理。主要的目的是为了代码的可移植性和可维护性。         例如在标准C的环境下，16位处理器的int是16位，...]]></description><category></category></item><item><title><![CDATA[BAT批处理基础知识]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/79379838</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/79379838</guid><author>ShiQW5696</author><pubDate>Mon, 26 Feb 2018 17:33:34 +0800</pubDate><description><![CDATA[批处理命令获取当前盘符和当前目录当前盘符：%~d0当前路径：%cd%当前执行命令行：%0当前bat文件路径：%~dp0当前bat文件短路径：%~sdp0]]></description><category></category></item><item><title><![CDATA[（划重点）汇编语言关键词和重要指令]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/79028343</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/79028343</guid><author>ShiQW5696</author><pubDate>Wed, 10 Jan 2018 21:06:38 +0800</pubDate><description><![CDATA[主要记录一些不容易记但经常用到的汇编语言关键词和重要指令。



循环

loop 执行循环 
loope和loopne就是比loop多了一个测试ZF标志位的东西 
loope是只有在CX不等于0和ZF=1的情况下才执行循环 
loopne是是只有在CX不等于0和ZF=0的情况下才执行循环



寄存器



ESP和EBP



ESP

ESP是扩展堆栈指针寄存器（Extended stack]]></description><category></category></item><item><title><![CDATA[汇编语言常见术语解释]]></title><link>https://blog.youkuaiyun.com/ShiQW5696/article/details/78983742</link><guid>https://blog.youkuaiyun.com/ShiQW5696/article/details/78983742</guid><author>ShiQW5696</author><pubDate>Fri, 05 Jan 2018 17:43:36 +0800</pubDate><description><![CDATA[寄存器

CS（Code Segment）：代码段寄存器； 
DS（Data Segment）：数据段寄存器； 
SS（Stack Segment）：堆栈段寄存器； 
ES（Extra Segment）：附加段寄存器。 
当一个程序要执行时，就要决定程序代码、数据和堆栈各要用到内存的哪些位置，通过设定段寄存器 CS，DS，SS, ES

esi，edi，分别是16位寄存器DI和SI的32位扩展。它...]]></description><category></category></item></channel></rss>