[AHK] 바이두 클라우드 모든 버전에 대응하는 패쳐 만들기
예전에 바이두 클라우드 한국어 패치 작업을 편하게 하기 위해 AHK를 이용하여 패쳐를 만들었었죠.
간단하고 급하게 만든것인지라 다양한 환경에서 오류가 생기기도 했습니다.
※ install 버전과 포터블 버전에 따른 오류
※ 클라우드 버전이 틀려서 생기는 오류
※ zip파일 압축을 풀지 않고 압축프로그램에서 실행해서 생기는 오류
※ 운영체제(XP,Win7계열)에 따른 설치경로가 틀려서 생기는 오류
이런 문제들때문에 아예 확 바꿨습니다.
exe파일 안에 한국어 패치한 버전별 모든 db 파일을 집어넣었습니다.
(zip파일 압축 프로그램으로 열어서 바로 실행해도 문제가 없음)
버전별 모든 db파일을 넣어서 설치된 버전을 체크해서 버전에 맞게 패치합니다.
install버전이 아닌 경우 포터블 폴더를 지정합니다.
db 파일 언팩/리팩에 도움을 주신 포레님(http://foreblog.tistory.com)께 감사드립니다.
2016년 10월 11일 변경 내용
바이두 클라우드의 이름 변경 (BaiduNetdisk) 적용
7za 압축 업데이트(7z1604)
AHK 컴파일 버전 업데이트(112401)
2016년 05월 04일 변경 내용
바이두 클라우드의 업데이트 기능으로 버전이 올라갔을때 패치가 제대로 되지 않던걸 수정했습니다.
예를들어 5.0버전을 설치 후 나중에 자동 업데이트로 5.1이 되었다고 하면
레지스트리에 저장된 프로그램 버전은 5.0이고 프로그램(exe)의 버전은 5.1입니다.
이전 패쳐의 경우 레지스트리의 버전값을 가지고 패쳐를 해서 오류가 발생했습니다.
그걸 프로그램 버전을 기준으로 변경했습니다.
패쳐(BaiduCloudKorPatcher160504.zip)를 새로 받아서 사용하시기 바랍니다.
2014년 09월 23일 추가 변경 내용
4.8.0 버전부터 패치 방식을 변경하여,
기존의 단순 수정된 db파일 복사하는 방식에서
db 파일을 직접 수정하는 방식으로 변경되었습니다.
default.db 파일의 용량이 버전마다 3메가를 넘겨서 부득이하게 변경하게 되었습니다.
4.8.0 이전 버전은 예전 방식대로 수정된 resource.db 파일만 복사하고
이후 버전은 티스토리 서버에서 압축된 xml파일을 받아서 버전에 맞게 수정합니다.
덕분에 이제 패쳐 실행파일 exe를 버전 업데이트때마다 새로 받을 필요가 없어졌습니다.
물론 인터넷이 연결된 상태여야되고 티스토리 서버가 죽으면 안 된다는 소소한(?) 문제가 있습니다만...
바이러스 오진 대응과 향후 새 버전 업데이트 대처를 위해 변경하게되었습니다.
BaiduCloudKorPatcher.exe 만 실행시키면 향후 업데이트된 바이두 클라우드가 나와도 제가 부지런히 번역 수정한 파일을 티스토리 서버에 올렸다면 바로 패치가 가능합니다.
AVAST등의 백신에서 바이러스 의심 파일로 바로 삭제가 되어 제대로 동작이 안 될 수 있습니다.
그럴땐 실시간 감시를 잠시 끄고 패치를 하시기 바랍니다.
사용 중인 백신 프로그램에서 바이러스로 검진됐을때 해당 백신 프로그램으로 오진 신고를 해주세요.
자동 업데이트가 된 다음 패쳐를 할 경우 한글이 이상하게 나올수 있습니다.
레지스트리와 실행파일에 기록된 버전이 이전 버전으로 저장되어 있어서 패쳐가 버전 인식을 못 해서 그렇습니다.
이럴 경우 바이두 클라우드 프로그램을 삭제 후 재설치한 다음 패치를 하시기 바랍니다.
최근 바이두 클라우드가 BaiduNetDisk로 이름이 변경되면서 아이콘도 파란색에서 흰색 아이콘(기존의 동기화방식)으로 변경되었습니다.
아이콘 따라서 패치 버튼을 누르시지 마시고 [웹하드방식] 버튼을 눌러서 패치하세요.
오토핫키 활용에 참고가 되었으면 합니다.
#NoTrayIcon
#NoEnv
#SingleInstance force
CoordMode,ToolTip,Screen
CoordMode,Mouse,Screen
CoordMode,Pixel,Screen
DownloadToFile(url, filename)
{
static a := "AutoHotkey/" A_AhkVersion
if (!(o := FileOpen(filename, "w")) || !DllCall("LoadLibrary", "str", "wininet") || !(h := DllCall("wininet\InternetOpen", "str", a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")))
return 0
c := s := 0
if (f := DllCall("wininet\InternetOpenUrl", "ptr", h, "str", url, "ptr", 0, "uint", 0, "uint", 0x80003000, "ptr", 0, "ptr"))
{
while (DllCall("wininet\InternetQueryDataAvailable", "ptr", f, "uint*", s, "uint", 0, "ptr", 0) && s>0)
{
VarSetCapacity(b, s, 0)
DllCall("wininet\InternetReadFile", "ptr", f, "ptr", &b, "uint", s, "uint*", r)
c += r
o.rawWrite(b, r)
}
DllCall("wininet\InternetCloseHandle", "ptr", f)
}
DllCall("wininet\InternetCloseHandle", "ptr", h)
o.close()
return c
}
if ( !A_IsCompiled ){
FileSetTime,%A_Now%,%A_ScriptDir%\BaiduYunGuanjia\data\xmls\*.*,C,1,1
FileSetTime,%A_Now%,%A_ScriptDir%\BaiduYunGuanjia\data\xmls\*.*,M,1,1
FileSetTime,%A_Now%,%A_ScriptDir%\BaiduYunGuanjia\data\xmls\*.*,A,1,1
Run, 7za.exe a -t7z -mx9 -y -r "newdata.7z" ".\xmls\*",%A_ScriptDir%\BaiduYunGuanjia\data,hide
}
tmpDir:=A_Temp "\BaiduPatch"
FileCreateDir, %tmpDir%
FileInstall, img\title.png, %A_Temp%\BaiduPatch\title.png, 1
FileInstall, img\baiduyunguanjia_.png, %A_Temp%\BaiduPatch\baiduyunguanjia.png, 1
FileInstall, img\baiduyun_.png, %A_Temp%\BaiduPatch\baiduyun.png, 1
FileInstall, img\trayicon_BaiduYun.bmp, %A_Temp%\BaiduPatch\trayicon_BaiduYun.bmp, 1
FileInstall, img\trayicon_BaiduYunGuanjia.bmp, %A_Temp%\BaiduPatch\trayicon_BaiduYunGuanjia.bmp, 1
FileInstall, img\trayicon_BaiduYun_off.bmp, %A_Temp%\BaiduPatch\trayicon_BaiduYun_off.bmp, 1
FileInstall, img\trayicon_BaiduYunGuanjia_off.bmp, %A_Temp%\BaiduPatch\trayicon_BaiduYunGuanjia_off.bmp, 1
FileInstall, BaiduYunGuanjia\data\7za.exe,%tmpDir%\7za.exe,1
FileInstall, BaiduYunGuanjia\data\OLECompactRepacker.exe,%tmpDir%\OLECompactRepacker.exe,1
if ( !A_IsCompiled ){
FileInstall, BaiduYunGuanjia\data\newdata.7z,%tmpDir%\newdata.7z,1
}else{
DownloadToFile("http://cfs.tistory.com/custom/blog/63/631340/skin/images/newdata.7z?=" A_Now,tmpDir "\newdata.7z")
}
Run,7za.exe x -y "newdata.7z",%tmpDir%,Hide
Gui, Color, FFFFFF
Gui, Add, Picture, x22 y70 w128 h128 , %A_Temp%\BaiduPatch\baiduyunguanjia.png
Gui, Add, Picture, x172 y70 w128 h128 , %A_Temp%\BaiduPatch\baiduyun.png
Gui, Add, Picture, x3 y10 w320 h50 , %A_Temp%\BaiduPatch\title.png
Gui, Add, Button, x22 y210 w130 h50 , 웹하드방식
Gui, Add, Button, x172 y210 w130 h50 , 동기화방식
Gui, Font, s8
Gui, Add, Link, x55 y265 w245 h20 +Right, 번역&제작 : http://w3tech.tistory.com/196
Gui, Show, h280 w326, 바이두 클라우드 한국어 패치
Return
refreshTray:
MouseGetPos,PosX,PosY
WinGet,Tray_ID,ID,ahk_class Shell_TrayWnd
WinGetPos, X1, Y1, cWidth, cHeight, ahk_id %Tray_ID%
X2 := X1+cWidth
Y2 := Y1+cHeight
ImageSearch, reX, reY, X1, Y1, X2, Y2, *10 %A_Temp%\BaiduPatch\trayicon_%client%.bmp
if ( ErrorLevel = 0 )
{
MouseMove, reX+5, reY+5,0
}else{
ImageSearch, reX, reY, X1, Y1, X2, Y2, *10 %A_Temp%\BaiduPatch\trayicon_%client%_off.bmp
if ( ErrorLevel = 0 )
{
MouseMove, reX+5, reY+5,0
}
}
MouseMove,%PosX%,%PosY%,0
Return
Button웹하드방식:
client=BaiduYunGuanjia
gosub,Patch
return
Button동기화방식:
client=BaiduYun
gosub,Patch
return
Patch:
if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME,WIN_XP,WIN_2000
{
RegRead, ver, HKLM,Software\Baidu\%client%,Version
}else{
RegRead, ver, HKCU,Software\Baidu\%client%,Version
}
if ( ErrorLevel = 1 )
{
MsgBox, %client%가 설치되어 있지 않습니다.`n클라우드가 설치된 경로를 선택하세요.
FileSelectFolder, path,,0,BaiduYunGuanjia.exe, resource.db가 있는 폴더 선택
if ErrorLevel = 1
{
MsgBox, 취소되었습니다.
return
}
IfNotExist, %path%\%client%.exe
{
MsgBox,%client%.exe 실행파일이 없는 폴더입니다.
if ( client = "BaiduYunGuanjia" )
client = BaiduNetdisk
return
}else{
FileGetVersion, ver_long, %path%\%client%.exe
if ( ErrorLevel > 0 ){
client = BaiduNetdisk
FileGetVersion, ver_long, %path%\%client%.exe
}
RegExMatch(ver_long,"([\d]+)\.([\d]+)\.([\d]+)\.[\d]+",vers)
ver := vers1 "." vers2 "." vers3
}
}else{
if A_OSVersion in WIN_NT4,WIN_95,WIN_98,WIN_ME,WIN_XP,WIN_2000
{
RegRead, path, HKLM,Software\Baidu\%client%,installDir
}else{
RegRead, path, HKCU,Software\Baidu\%client%,installDir
}
FileGetVersion, ver_long, %path%\%client%.exe
if ( ErrorLevel > 0 ){
client = BaiduNetdisk
FileGetVersion, ver_long, %path%\%client%.exe
}
RegExMatch(ver_long,"([\d]+)\.([\d]+)\.([\d]+)\.[\d]+",vers)
exe_ver := vers1 "." vers2 "." vers3
if ( ver != exe_ver ){
MsgBox, 레지스트리의 버전 : %ver%`n실행 파일의 버전 : %exe_ver%`n%exe_ver% 버전으로 패치합니다.
ver:=exe_ver
}
}
FileList =
Process, Close, %client%.exe
Sleep,500
gosub, refreshTray
if ( client = "BaiduNetdisk" )
client = BaiduYunGuanjia
Loop, %tmpDir%\%client%\*,1
FileList = %FileList%%A_LoopFileName%`n
Loop, parse, FileList, `n
{
IfInString, A_LoopField, %ver%
{
found:=1
break
}
}
if ( found != 1 )
{
MsgBox, 패치파일이 없습니다!(ver %ver%)`n설치된 버전에 맞는 번역 패치가 없습니다!`nhttp://w3tech.tistory.com 블로그에서 확인하세요.
gosub, goExit
}else{
found:=
patched:=0
FileCopy, %path%\resource.db, %path%\resource_%ver%_%A_Now%.db, 1
if ErrorLevel = 1
{
MsgBox, resource.db 파일백업 실패!
return
}
FileCopy, %path%\skin\default.db, %path%\skin\default_%ver%_%A_Now%.db, 1
if ErrorLevel = 1
{
MsgBox, default.db 파일백업 실패!
return
}
IfExist, %tmpDir%\%client%\%ver%\default
{
cmdRun:="OLECompactRepacker.exe -R """ path "\skin\default.db"" " tmpDir "\" client "\" ver "\default"""
try
{
RunWait, %cmdRun%,%tmpDir%,hide,runPID
} catch e {
MsgBox, default.db 수정 실패!`n%e%
patched++
}
}
IfExist, %tmpDir%\%client%\%ver%\resource
{
cmdRun:="OLECompactRepacker.exe -R """ path "\resource.db"" " tmpDir "\" client "\" ver "\resource"""
try
{
RunWait, %cmdRun%,%tmpDir%,hide,runPID
} catch e {
MsgBox, resource.db 수정 실패!`n%e%
patched++
}
}
IfExist, %tmpDir%\%client%\%ver%\duiengineskin
{
FileCopy, %path%\skin\duiengineskin.zip, %path%\skin\duiengineskin_%ver%_%A_Now%.zip, 1
if ErrorLevel = 1
{
MsgBox, duiengineskin.zip 파일백업 실패!
return
}
cmdRun:="7za.exe u -r """ path "\skin\duiengineskin.zip"" " tmpDir "\" client "\" ver "\duiengineskin\*"""
try
{
RunWait, %cmdRun%,%tmpDir%,hide,runPID
} catch e {
MsgBox, duiengineskin.zip 수정 실패!`n%e%
patched++
}
}
}
if ( patched < 1 ){
MsgBox, 패치 완료! (%ver% 버전)`n최신 버전의 한글패치는`nhttp://w3tech.tistory.com`n방문해주세요!
IfExist, %path%\%client%.exe
Run, %path%\%client%.exe,,Hide
else
Run, %path%\BaiduNetdisk.exe,,Hide
gosub, goExit
}else{
MsgBox, 패치 실패! (%patched%개)`n패쳐를 관리자 권한으로 실행해보세요.
}
return
Exit:
GuiClose:
gosub, goExit
return
goExit:
FileRemoveDir, %tmpDir%, 1
ExitApp
return