植物大战僵尸中文第二版和年度版 游戏分析及delphi源码

时间:2021-10-18 06:05:46

00413184 |. E8 77E30100   |CALL PlantsVs.00431500                  ; 地上的物品
00413189 |. 8D7424 10     |LEA ESI,DWORD PTR SS:[ESP+10]
0041318D |. 8BD3          |MOV EDX,EBX
0041318F |. E8 7C980000   |CALL PlantsVs.0041CA10
00413194 |. 84C0          |TEST AL,AL
00413196 |.^ 75 E8         \JNZ SHORT PlantsVs.00413180
00413198 |> 8D7424 10     LEA ESI,DWORD PTR SS:[ESP+10]
0041319C |. 8BD3          MOV EDX,EBX
0041319E |. 896C24 10     MOV DWORD PTR SS:[ESP+10],EBP
004131A2 |. E8 C9980000   CALL PlantsVs.0041CA70
004131A7 |. 84C0          TEST AL,AL
004131A9 |. 74 1E         JE SHORT PlantsVs.004131C9
004131AB |. EB 03         JMP SHORT PlantsVs.004131B0
004131AD |   8D49 00       LEA ECX,DWORD PTR DS:[ECX]
004131B0 |> 8B4424 10     /MOV EAX,DWORD PTR SS:[ESP+10]
004131B4 |. 50            |PUSH EAX
004131B5 |. E8 26550400   |CALL PlantsVs.004586E0
004131BA |. 8D7424 10     |LEA ESI,DWORD PTR SS:[ESP+10]
004131BE |. 8BD3          |MOV EDX,EBX
004131C0 |. E8 AB980000   |CALL PlantsVs.0041CA70
004131C5 |. 84C0          |TEST AL,AL
004131C7 |.^ 75 E7         \JNZ SHORT PlantsVs.004131B0

004131C9 |> 8Bc3 3C010000 MOV EDI,DWORD PTR DS:[EBX+13C]           ; edi = 游戏基址
004131CF |. E8 CC5B0200   CALL PlantsVs.00438DA0
004131D4 |. 8BB3 38010000 MOV ESI,DWORD PTR DS:[EBX+138]
004131DA |. E8 A1550200   CALL PlantsVs.00438780
004131DF |. 8B83 44010000 MOV EAX,DWORD PTR DS:[EBX+144]
004131E5 |. 33F6          XOR ESI,ESI
004131E7 |. 3968 24       CMP DWORD PTR DS:[EAX+24],EBP
004131EA |. 7E 1E         JLE SHORT PlantsVs.0041320A
004131EC |. 33FF          XOR EDI,EDI
004131EE |. 8BFF          MOV EDI,EDI
004131F0 |> 8D4407 28     /LEA EAX,DWORD PTR DS:[EDI+EAX+28]
004131F4 |. E8 57400700   |CALL PlantsVs.00487250
004131F9 |. 8B83 44010000 |MOV EAX,DWORD PTR DS:[EBX+144]
004131FF |. 83C6 01       |ADD ESI,1
00413202 |. 83C7 50       |ADD EDI,50
00413205 |. 3B70 24       |CMP ESI,DWORD PTR DS:[EAX+24]
00413208 |.^ 7C E6         \JL SHORT PlantsVs.004131F0
0041320A |> 5F            POP EDI
0041320B |. 5E            POP ESI
0041320C |. 5D            POP EBP
0041320D |. 83C4 08       ADD ESP,8
00413210 \. C3            RETN

00410A94 |. 52            PUSH EDX                                 ; -1
00410A95 |. 50            PUSH EAX                                 ; 植物类型
00410A96 |. 8B4424 20     MOV EAX,DWORD PTR SS:[ESP+20]            ; Y
00410A9A |. 57            PUSH EDI                                 ; X
00410A9B |. 55            PUSH EBP                                 ; 游戏基址
00410A9C |. E8 7FC6FFFF   CALL PlantsVs.0040D120

修改器代码:

var
Form1: TForm1;
pGameBase:Pointer;
pPlantBaseArray:array[..] of pointer;
pMonBaseArray:array[..] of pointer;
pGoodsBaseArray:array[..] of pointer;
pPlantToolBarBaseArray:array[..] of pointer;
type
stMonsterInfo = record
x:single;
y:single;
nMaxHP:integer;
nCurHP:integer;
nRow:integer;
fSize:single;
end; type
stPlantToolBarInfo = record
nType:integer;
nMaxRecovery:integer;
nCurRecovery:integer;
end; type
stGoodsInfo = record
nType:integer;
end; type
stPlantInfo = record
bIsProdure:integer;
nType:integer;
end; implementation {$R *.dfm} procedure GetGameBase();
begin
asm
pushad
mov eax, $6a9ec0
mov eax, [eax]
add eax, $
mov eax, [eax] mov pGameBase, eax //游戏基址
popad
end;
end; function GetMonsterBase(pMonBase:Pointer):Pointer;
begin
asm
pushad
mov esi, pMonBase mov edx, pGameBase//游戏基址
mov edi, $0041C8F0
call edi//获取一个怪物地址 popad
end; Result:= Pointer(pMonBase^);
end; function GetPlantBase(pPlantBase:Pointer):Pointer;
begin
asm
pushad
mov esi, pPlantBase mov edx, pGameBase//游戏基址
mov edi, $0041C950
call edi//获取一个植物地址 popad
end; Result:= Pointer(pPlantBase^);
end; function GetGoodsBase(pGoodsBase:Pointer):Pointer;
begin
asm
pushad
mov esi, pGoodsBase mov edx, pGameBase//游戏基址
mov edi, $0041CA10
call edi//获取一个植物地址 popad
end; Result:= Pointer(pGoodsBase^);
end; function GetPlantToolbarBase(nIndex:integer):Pointer;
var
pBase:Pointer;
n:integer; begin
n:= nIndex * $ + $;
asm
pushad
mov eax, pGameBase
mov eax, [eax + $]
mov pBase, eax
popad
end; pBase:= Pointer(DWORD(pBase) + n);
Result:= pBase;
end; function GetMaxPlantNum():integer;
var
n:integer;
begin
asm
pushad
mov eax, pGameBase
mov eax, [eax + $]
mov eax, [eax + $]
mov n, eax
popad
end; Result:= n;
end; procedure FreshMonsterList();
var
pMonBase:Integer;
n, nIndex:integer; begin
nIndex:= ;
pMonBase:= ;
n:= form1.RzComboBox1.ItemIndex;
form1.RzComboBox1.Clear;
repeat
pMonBase:= Integer(GetMonsterBase(@pMonBase));
if pMonBase = - then
begin
form1.RzComboBox1.ItemIndex:= n;
exit;
end;
form1.RzComboBox1.Add('怪物:' + IntToStr(nIndex + )) ;
pMonBaseArray[nIndex]:= Pointer(pMonBase);
nIndex:= nIndex + ;
until(false);
form1.RzComboBox1.ItemIndex:= n;
end; procedure FreshPlantToolBarList();
var
nMaxPlant:integer;
i:integer;
pPlantBase:Pointer;
n, nIndex:integer; begin
n:= form1.RzComboBox2.ItemIndex; form1.RzComboBox2.Clear;
nIndex:= ;
nMaxPlant:= GetMaxPlantNum();
for i:= to nMaxPlant - do
begin
pPlantBase:= GetPlantToolbarBase(i);
pPlantToolBarBaseArray[nIndex]:= pPlantBase;
nIndex:= nIndex + ;
form1.RzComboBox2.Add('植物栏:' + IntToStr(nIndex));
end; form1.RzComboBox2.ItemIndex:= n;
end; procedure TForm1.FormCreate(Sender: TObject);
begin
GetGameBase();
end; procedure FreshPlantList();
var
pPlantBase:Integer;
n, nIndex:integer; begin
n:= form1.RzComboBox4.ItemIndex;
form1.RzComboBox4.Clear;
nIndex:= ;
pPlantBase:= ; repeat
pPlantBase:= Integer(GetPlantBase(@pPlantBase));
if pPlantBase = - then
begin
form1.RzComboBox4.ItemIndex:= n;
exit;
end; form1.RzComboBox4.Add('植物:' + IntToStr(nIndex + )) ;
pPlantBaseArray[nIndex]:= Pointer(pPlantBase);
nIndex:= nIndex + ;
until(false);
end; procedure FreshGoodsList();
var
pGoodsBase:Integer;
cItem:TListItem;
n, nIndex:integer; begin
n:= form1.RzComboBox3.ItemIndex;
form1.RzComboBox3.Clear;
nIndex:= ;
pGoodsBase:= ; repeat
pGoodsBase:= Integer(GetGoodsBase(@pGoodsBase));
if pGoodsBase = - then
begin
form1.RzComboBox3.ItemIndex:= n;
exit;
end;
form1.RzComboBox3.Add('物品:' + IntToStr(nIndex + )) ;
pGoodsBaseArray[nIndex]:= Pointer(pGoodsBase);
nIndex:= nIndex + ;
until(false);
end; procedure TForm1.TabSheet2Show(Sender: TObject);
begin
form1.RzComboBox1.Clear;
FreshMonsterList();
if form1.RzComboBox1.Items.Count > then
form1.RzComboBox1.ItemIndex:= ;
end; procedure TForm1.TabSheet5Show(Sender: TObject);
begin
FreshGoodsList();
if form1.RzComboBox3.Items.Count > then
form1.RzComboBox3.ItemIndex:= ;
end; procedure TForm1.TabSheet4Show(Sender: TObject);
begin
FreshPlantList();
if form1.RzComboBox4.Items.Count > then
form1.RzComboBox4.ItemIndex:= ;
end; procedure SetMonsterInfo(pMonBase:Pointer; stMonInfo:stMonsterInfo);
var
s:single; begin
s:= stMonInfo.fSize;
asm
pushad
mov eax, pMonBase
mov ecx, stMonInfo.x
mov [eax + $2c], ecx mov ecx, stMonInfo.y
mov [eax + $], ecx mov ecx, stMonInfo.nCurHP
mov [eax + $C8], ecx mov ecx, stMonInfo.nMaxHP
mov [eax + $cc], ecx mov ecx, stMonInfo.nRow
mov [eax + $1c], ecx mov ecx, stMonInfo.fSize
mov [eax + $11c], ecx
popad
end;
end; procedure GetMonsterInfo(pMonBase:Pointer;stMonInfo:stMonsterInfo);
var
x:single;
y:single;
nMaxHP:integer;
nCurHP:integer;
nRow:integer;
fSize:single;
begin
asm
pushad
mov eax, pMonBase
mov ecx, [eax + $2c]
mov x, ecx mov ecx, [eax + $]
mov y, ecx mov ecx, [eax + $c8]
mov nCurHP, ecx mov ecx, [eax + $cc]
mov nMaxHP, ecx mov ecx, [eax + $1c]
mov nRow, ecx mov ecx, [eax + $11c]
mov fSize, ecx
popad
end; form1.RzEdit5.Text:= FloatToStr(x);
form1.RzEdit5.Text:= FloatToStr(x);
form1.RzEdit6.Text:= FloatToStr(y);
form1.RzEdit7.Text:= IntToStr(nMaxHP);
form1.RzEdit8.Text:= IntToStr(nCurHP);
form1.RzEdit9.Text:= IntToStr(nRow);
form1.RzEdit10.Text:= FloatToStr(fSize);
end; procedure TForm1.RzButton4Click(Sender: TObject);
var
pMonBase:Pointer;
stInfo:stMonsterInfo;
nIndex:integer;
begin
if form1.RzComboBox1.Items.Count <= then
exit;
nIndex:= form1.RzComboBox1.ItemIndex;
FreshMonsterList();
pMonBase:= Pointer(pMonBaseArray[nIndex]); stInfo.x:= StrToFloat(form1.RzEdit5.Text);
stInfo.y:= StrToFloat(form1.RzEdit6.Text);
stInfo.nMaxHP:= StrToInt(form1.RzEdit7.Text);
stInfo.nCurHP:= StrToInt(form1.RzEdit8.Text);
stInfo.nRow:= StrToInt(form1.RzEdit9.Text);
stInfo.fSize:= StrToFloat(form1.RzEdit10.Text); nIndex:= form1.RzComboBox1.ItemIndex;
FreshMonsterList();
pMonBase:= Pointer(pMonBaseArray[nIndex]);
SetMonsterInfo(pMonBase, stInfo); end; procedure TForm1.RzComboBox1Change(Sender: TObject);
var
stInfo:stMonsterInfo;
pMonBase:pointer;
nIndex:integer; begin
if form1.RzComboBox1.Items.Count <= then
exit;
nIndex:= form1.RzComboBox1.ItemIndex;
FreshMonsterList();
pMonBase:= Pointer(pMonBaseArray[nIndex]);
GetMonsterInfo(pMonBase, stInfo); end; procedure TForm1.RzComboBox1CloseUp(Sender: TObject);
begin
FreshMonsterList();
end; procedure SetGoodsInfo(pGoodsBase:Pointer; stInfo:stGoodsInfo);
var
nType:integer; begin
nType:= stInfo.nType;
asm
pushad
mov eax, pGoodsBase mov ecx, nType
mov [eax + $], ecx
popad
end;
end; procedure GetGoodsInfo(pGoodsBase:Pointer; var stInfo:stGoodsInfo);
var
nType:integer; begin
asm
pushad
mov eax, pGoodsBase
mov ecx, [eax + $]
mov nType, ecx
popad
end; form1.RzEdit4.Text:= IntToStr(nType);
end; procedure TForm1.TabSheet3Show(Sender: TObject);
begin
FreshPlantToolBarList();
if form1.RzComboBox2.Items.Count > then
form1.RzComboBox2.ItemIndex:= ;
end; procedure TForm1.RzComboBox3Change(Sender: TObject);
var
stInfo:stGoodsInfo;
pGoodsBase:pointer;
nIndex:integer; begin
if form1.RzComboBox3.Items.Count <= then
exit;
nIndex:= form1.RzComboBox3.ItemIndex;
FreshGoodsList();
pGoodsBase:= Pointer(pGoodsBaseArray[nIndex]);
GetGoodsInfo(pGoodsBase, stInfo);
end; procedure TForm1.RzButton3Click(Sender: TObject);
var
stInfo:stGoodsInfo;
nIndex:integer;
pGoodsBase:Pointer; begin
if (form1.RzComboBox3.Items.Count <= ) and (StrToInt(form1.RzEdit4.Text) <= ) then
exit; nIndex:= form1.RzComboBox3.ItemIndex;
FreshGoodsList();
pGoodsBase:= Pointer(pGoodsBaseArray[nIndex]);
// ShowMessage(IntToStr(DWORD(pGoodsBase)));
stInfo.nType:= StrToInt(form1.RzEdit4.Text);
SetGoodsInfo(pGoodsBase, stInfo);
end; procedure GetPlantInfo(pPlantBase:Pointer; var stInfo:stPlantInfo);
var
bIsProdure:integer;
nType:integer; begin
asm
pushad
mov eax, pPlantBase
mov ecx, [eax + $]
mov bIsProdure, ecx mov ecx, [eax + $]
mov nType, ecx
popad
end; form1.RzEdit3.Text:= IntToStr(bIsProdure);
form1.RzEdit2.Text:= IntToStr(nType);
end; procedure SetPlantInfo(pPlantBase:Pointer; stInfo:stPlantInfo);
var
bIsProdure:integer;
nType:integer; begin
bIsProdure:= stInfo.bIsProdure;
nType:= stInfo.nType;
asm
pushad
mov eax, pPlantBase
mov ecx, bIsProdure
mov [eax + $], ecx mov ecx, nType
mov [eax + $], ecx
popad
end;
end; procedure TForm1.RzComboBox4Change(Sender: TObject);
var
stInfo:stPlantInfo;
pPlantBase:pointer;
nIndex:integer; begin
if form1.RzComboBox4.Items.Count <= then
exit;
nIndex:= form1.RzComboBox4.ItemIndex;
FreshPlantList();
pPlantBase:= Pointer(pPlantBaseArray[nIndex]);
GetPlantInfo(pPlantBase, stInfo);
end; procedure TForm1.RzButton2Click(Sender: TObject);
var
stInfo:stPlantInfo;
nIndex:integer;
pPlantBase:Pointer; begin
if (MessageBox(form1.Handle, '该功能可能会引起不良效果,请确定要不要使用?使用前请先保存游戏!!', '提示', Windows.MB_ICONWARNING or MB_YESNO) = IDNO) then
exit; if (form1.RzComboBox4.Items.Count <= ) then
exit; nIndex:= form1.RzComboBox4.ItemIndex;
FreshPlantList();
pPlantBase:= Pointer(pPlantBaseArray[nIndex]);
// ShowMessage(IntToStr(DWORD(pGoodsBase)));
stInfo.bIsProdure:= StrToInt(form1.RzEdit3.Text);
stInfo.nType:= StrToInt(form1.RzEdit2.Text);
SetPlantInfo(pPlantBase, stInfo);
end; procedure TForm1.RzComboBox4CloseUp(Sender: TObject);
begin
FreshPlantList();
end; procedure GetPlantToolBarInfo(pPlantBase:Pointer; var stInfo:stPlantToolBarInfo);
var
nType:integer;
nMaxRecovery:integer;
nCurRecovery:integer; begin
asm
pushad
mov eax, pPlantBase
mov ecx, [eax + $]
mov nType, ecx mov ecx, [eax + $]
mov nCurRecovery, ecx mov ecx, [eax + $]
mov nMaxRecovery, ecx popad
end; form1.RzEdit1.Text:= IntToStr(nType);
form1.RzEdit11.Text:= IntToStr(nCurRecovery);
form1.RzEdit12.Text:= IntToStr(nMaxRecovery);
end; procedure SetPlantToolBarInfo(pPlantBase:Pointer; var stInfo:stPlantToolBarInfo);
var
nType:integer;
nMaxRecovery:integer;
nCurRecovery:integer;
begin
nType:= stInfo.nType;
nMaxRecovery:= stInfo.nMaxRecovery;
nCurRecovery:= stInfo.nCurRecovery;
asm
pushad
mov eax, pPlantBase
mov ecx, nType
mov [eax + $], ecx mov ecx, nMaxRecovery
mov [eax + $], ecx mov ecx, nCurRecovery
mov [eax + $], ecx
popad
end;
end; procedure TForm1.RzComboBox2Change(Sender: TObject);
var
stInfo:stPlantToolBarInfo;
pPlantToolBarBase:pointer;
nIndex:integer; begin
if form1.RzComboBox2.Items.Count <= then
exit;
nIndex:= form1.RzComboBox2.ItemIndex;
FreshPlantToolBarList();
pPlantToolBarBase:= Pointer(pPlantToolBarBaseArray[nIndex]);
GetPlantToolBarInfo(pPlantToolBarBase, stInfo);
end; procedure TForm1.RzButton1Click(Sender: TObject);
var
stInfo:stPlantToolBarInfo;
nIndex:integer;
pPlantToolBarBase:Pointer; begin
if (form1.RzComboBox2.Items.Count <= ) then
exit; nIndex:= form1.RzComboBox2.ItemIndex;
FreshPlantToolBarList();
pPlantToolBarBase:= Pointer(pPlantToolBarBaseArray[nIndex]);
// ShowMessage(IntToStr(DWORD(pGoodsBase)));
stInfo.nType:= StrToInt(form1.RzEdit1.Text);
stInfo.nMaxRecovery:= StrToInt(form1.RzEdit12.Text);
stInfo.nCurRecovery:= StrToInt(form1.RzEdit11.Text);
SetPlantToolBarInfo(pPlantToolBarBase, stInfo);
end; procedure TForm1.RzButton6Click(Sender: TObject);
var
nPlantToolBarNum:integer; begin
asm
pushad
mov eax, pGameBase
mov eax, [eax + $]
add eax, $ mov ecx,
mov [eax], ecx
popad
end
end; procedure TForm1.RzButton5Click(Sender: TObject);
begin
asm
pushad
mov eax, pGameBase
add eax, $
mov [eax],
popad
end;
end; procedure TForm1.RzComboBox3CloseUp(Sender: TObject);
begin
FreshGoodsList();
end; procedure TForm1.RzComboBox2CloseUp(Sender: TObject);
begin
FreshPlantToolBarList();
end; function WriteMemory(szProcName:PChar; pAddr:Pointer; szBuf:array of char; dwSize:DWORD):boolean;
var
hGameWnd:HWND;
dwID:DWORD;
hProc:THandle;
dwWriteByte:DWORD; begin
hGameWnd:= FindWindow(nil, szProcName);
GetWindowThreadProcessId(hGameWnd, dwID);
hProc:= OpenProcess(PROCESS_ALL_ACCESS, false, dwID);
if hProc = then
begin
Result:= false;
exit;
end; WriteProcessMemory(hProc, pAddr, @szBuf, dwSize, dwWriteByte);
CloseHandle(hProc); Result:= true;
end; procedure ModiryPlantToolBar();
var
nMaxPlant:integer;
i:integer;
pPlantBase:Pointer;
n, nIndex:integer; begin
nIndex:= ;
nMaxPlant:= GetMaxPlantNum();
for i:= to nMaxPlant - do
begin
pPlantBase:= GetPlantToolbarBase(i);
asm
pushad
mov eax, pPlantBase
mov [eax + $],
popad
end;
nIndex:= nIndex + ;
end;
end; procedure TForm1.RzButton7Click(Sender: TObject);
var
szBuf:array[..] of char; begin
szBuf[]:= Char($);
szBuf[]:= Char($);
szBuf[]:= Char($);
WriteMemory('植物大战僵尸中文版', Pointer($488f7d), szBuf, );
ModiryPlantToolBar(); asm
pushad
mov eax, pGameBase
add eax, $
mov [eax],
popad
end;
end; procedure GrowPlant(x,y,nType:integer);
begin
asm
pushad
mov eax, y
push -
push nType
push x
push pGameBase
mov edi, $0040D120
call edi
popad
end;
end;
procedure TForm1.RzButton8Click(Sender: TObject);
var
x,y:integer;
nType:integer;
n:integer; begin
randomize;
nType:= ;
n:= ;
for x:= to do
begin
for y:= to do
begin
if RzComboBox5.ItemIndex = then
nType:= math.RandomRange(, )
else if RzComboBox5.ItemIndex = then
begin
nType:= n;
n:= n + ;
if n = then
n:= ;
end
else
nType:= RzComboBox5.ItemIndex - ; GrowPlant(x, y, nType);
end;
end;
end; procedure TForm1.TabSheet1Show(Sender: TObject);
var
i:integer;
begin
RzComboBox5.Add('随机种植');
RzComboBox5.Add('顺序种植'); for i:= to do
RzComboBox5.Add(IntToStr(i)); RzComboBox5.ItemIndex:= ;
end; procedure TForm1.TabSheet1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
GetGameBase();
end; procedure TForm1.RzButton9Click(Sender: TObject);
var
szBuf:array[..] of char; begin
szBuf[]:= Char($);
szBuf[]:= Char($);
szBuf[]:= Char($);
szBuf[]:= Char($); WriteMemory('植物大战僵尸中文版', Pointer($52FCF0), szBuf, );
end; procedure KillAllMonster();
var
pMonBase:Integer;
n, nIndex:integer;
stInfo:stMonsterInfo;
begin
nIndex:= ;
pMonBase:= ;
repeat
pMonBase:= Integer(GetMonsterBase(@pMonBase));
if pMonBase = - then
begin
exit;
end;
asm
pushad
mov eax, pMonBase
mov [eax + $c8], -
popad
end;
until(false);
end; procedure TForm1.RzButton10Click(Sender: TObject);
begin
ShowMessage('由于种种原因,怪物需要再K它一下,O(∩_∩)O哈哈~');
KillAllMonster();
end; end.

以上分析中,红色的数据经过《植物大战僵尸中文第二版》测试通过。

---------------------------------------------------------------

年度版:

阳光: [[7794F8]+868]+5578

植物冷却状态地址(0为不可用,1为可用):
第1格: [[[7794F8]+868]+15C]+70
第2格: [[[7794F8]+868]+15C]+C0
第3格: [[[7794F8]+868]+15C]+110
第4格: [[[7794F8]+868]+15C]+160
第5格: [[[7794F8]+868]+15C]+1B0
第6格: [[[7794F8]+868]+15C]+200
第7格: [[[7794F8]+868]+15C]+250
第8格: [[[7794F8]+868]+15C]+2A0
第9格: [[[7794F8]+868]+15C]+2F0
第10格: [[[7794F8]+868]+15C]+340

植物大战僵尸中文第二版和年度版 游戏分析及delphi源码的更多相关文章

  1. 一步步实现windows版ijkplayer系列文章之三——Ijkplayer播放器源码分析之音视频输出——音频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  2. 中文情感分析——snownlp类库 源码注释及使用

    最近发现了snownlp这个库,这个类库是专门针对中文文本进行文本挖掘的. 主要功能: 中文分词(Character-Based Generative Model) 词性标注(TnT 3-gram 隐 ...

  3. 腾讯QQ音乐网页版 音频初始化模块解压混淆js源码

    define("js/view/playerBar.js",function(t,e,o){ var i = t("js/lib/zepto.js"), a = ...

  4. C&num;版Windows服务安装卸载小工具-附源码

    前言 在我们的工作中,经常遇到Windows服务的安装和卸载,在之前公司也普写过一个WinForm程序选择安装路径,这次再来个小巧灵活的控制台程序,不用再选择,只需放到需要安装服务的目录中运行就可以实 ...

  5. 第二十五课:jQuery&period;event&period;trigger的源码解读

    本课主要来讲解jQuery.event.trigger的源码解读. trigger = function(event, data, elem, onlyHandlers){ if(elem & ...

  6. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  7. 一步步实现windows版ijkplayer系列文章之二——Ijkplayer播放器源码分析之音视频输出——视频篇

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  8. 一步步实现windows版ijkplayer系列文章之七——终结篇(附源码)

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  9. 五子棋C&num;源码,网络对战版---转载--待学习

    五子棋C#源码,网络对战版 支持网络对战的C#五子棋源码下载,VS2010环境编译后可运行,需要先输入ip地址才行,不是单机版的.部分代码摘录如下://将接收的消息转换成自定义集合MessClass ...

随机推荐

  1. ABP框架 - Swagger UI 集成

    文档目录 本节内容: 简介 Asp.net Core 安装 安装Nuget包 配置 测试 Asp.net 5.x 安装 安装Nuget包 配置 测试 简介 来自它的网页:“...使用一个Swagger ...

  2. arm-linux-objdump

    一.arm-linux-objdump常用来显示二进制文件信息,常用来查看反汇编代码二.常用选项:1.-b bfdname 指定目标码格式2.—disassemble或者-d 反汇编可执行段3.—di ...

  3. android 利用重力感应监听 来电时翻转手机后静音。

       在CallNotifier.java中 加入如下代码: public void GetSensorManager(Context context) { sm = (SensorManager) ...

  4. Duilib使用wke显示echarts

    不得不说wke是个简洁好用的浏览器内核.网上很多大神已经把wke嵌入到duilib中了,先感谢他们辛勤的工作.这里通过wke吧C++的数据在ECharts上美观的显示出来.借鉴前人,将ECharts进 ...

  5. linux 权限字母含义

    查看某一文件夹下所有文件夹的权限情况:ls -l分别是:所有者(user)-所有者(user)-其他人(other)r 表示文件可以被读(read)w 表示文件可以被写(write)x 表示文件可以被 ...

  6. &period;Net 使用爬虫下载网络图片到本地磁盘

    准备: 1.新建控制台项目 2.引用System.Drawing类库 3.安装HtmlAgilityPack 1.5.2.0 4.如果不会XPath语法的话,建议简单看下 代码: static voi ...

  7. google 谷歌地图

    https://www.cnblogs.com/yincheng/p/google-map.html https://blog.csdn.net/sinat_21189673/article/deta ...

  8. maven工程下添加oracle驱动包

    maven工程手动安装oracle驱动包到本地仓库 下载ojdbc.jar包 这个当然是最好去官网下载了.http://mvnrepository.com这个仓库上有,具体页面地址为: http:// ...

  9. asp&period;net文件上传接收不到文件 Request&period;files&lbrack;&quot&semi;&&num;39&semi;&rsqb;等于null

    这个时候你应该检查下你的form表单里面是否配置了这个: enctype ="multipart/form-data"  新手容易出错哦. <form id="fo ...

  10. flowable EngineConfiguration的实现分析(2)

    EngineConfiguration的实现类是一个抽象类:AbstractEngineConfiguration 一.引擎配置的分类 继承 AbsractEngineConfiguration的子类 ...