From 6712499feebbb7694e9283863a73f7b49f1cdf18 Mon Sep 17 00:00:00 2001 From: gb <741021719@qq.com> Date: Mon, 11 Jul 2022 10:59:36 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E6=89=B9=E5=A4=84=E7=90=86?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=8F=82=E6=95=B0onlytwain=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E6=9B=B4=E6=94=B9twain=E5=B7=A5=E7=A8=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.bat | 34 ++++++++-- sln/Release/hgsetver.exe | Bin 85504 -> 87040 bytes sln/hgsetver/hgsetver.cpp | 135 ++++++++++++++++++++++++++------------ twain/twain.vcxproj | 19 +++--- 4 files changed, 133 insertions(+), 55 deletions(-) diff --git a/build.bat b/build.bat index a74e9ad..b363e0b 100644 --- a/build.bat +++ b/build.bat @@ -1,12 +1,15 @@ echo off -echo "build.bat [hw | lsc] [x86 | x64] [0x100 | 0x...]" +echo "build.bat [hw | lsc] [x86 | x64] [0x100 | 0x...] [onlytwain]" set OEM=hg set CPU=x86 set PID=0x100 +set COMPILE_RANGE="" set VAL=%1 -if "%1"=="hw" ( +if "%1"=="onlytwain" ( + set COMPILE_RANGE="-only-twain" +) else if "%1"=="hw" ( set OEM=%1 )else if "%1"=="lsc" ( set OEM=%1 @@ -21,7 +24,9 @@ set OEM=%1 ) set VAL=%2 -if "%2"=="hw" ( +if "%2"=="onlytwain" ( + set COMPILE_RANGE="-only-twain" +) else if "%2"=="hw" ( set OEM=%2 )else if "%2"=="lsc" ( set OEM=%2 @@ -36,7 +41,9 @@ set OEM=%2 ) set VAL=%3 -if "%3"=="hw" ( +if "%3"=="onlytwain" ( + set COMPILE_RANGE="-only-twain" +) else if "%3"=="hw" ( set OEM=%3 )else if "%3"=="lsc" ( set OEM=%3 @@ -50,10 +57,27 @@ set OEM=%3 ) ) +set VAL=%4 +if "%4"=="onlytwain" ( + set COMPILE_RANGE="-only-twain" +) else if "%4"=="hw" ( +set OEM=%4 +)else if "%4"=="lsc" ( +set OEM=%4 +) else ( + if "%4"=="x64" ( + set CPU=%4 + ) else if "%4"=="x86" ( + set CPU=%4 + ) else if "%VAL:~0,2%"=="0x" ( + set PID=%VAL% + ) +) + echo oem=%OEM% echo cpu=%CPU% echo pid=%PID% -"%~dp0\sln\release\hgsetver.exe" "%~dp0\twain\brand.h" -oem %OEM% -cpu %CPU% -pid %PID% +"%~dp0\sln\release\hgsetver.exe" "%~dp0\twain\brand.h" -oem %OEM% -cpu %CPU% -pid %PID% %COMPILE_RANGE% "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe" "%~dp0\device\scanner.vcxproj" /p:Configuration=Release /p:Platform=x86 "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe" "%~dp0\sane\sane.vcxproj" /p:Configuration=Release /p:Platform=x86 "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\MSBuild.exe" "%~dp0\twain\twain.vcxproj" /p:Configuration=Release /p:Platform=x86 diff --git a/sln/Release/hgsetver.exe b/sln/Release/hgsetver.exe index 5acd4233c9a55c4bd2e6b3f2fc0051feaeaa6a14..3c8639eaf57fa07af0289e357caa2c5786aee1a2 100644 GIT binary patch delta 22082 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 diff --git a/sln/hgsetver/hgsetver.cpp b/sln/hgsetver/hgsetver.cpp index 61fadd0..2c44d61 100644 --- a/sln/hgsetver/hgsetver.cpp +++ b/sln/hgsetver/hgsetver.cpp @@ -21,7 +21,7 @@ enum oem #define GET_ENUM_VALUE_W(e, v) \ if(L###e == v) return e; -static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main = 0); +static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main = 0, bool twain_only = false); int main() { @@ -37,7 +37,7 @@ int main() if (pos != std::wstring::npos) pe.erase(pos); - std::wcout << L"Usage: " << pe.c_str() << L" [-pid product_id lead with '0x'] [-main main-ver, all version will be omitted if this was not given or be ZERO] [-cpu x86|x64] [-oem hw|lsc]\r\n"; + std::wcout << L"Usage: " << pe.c_str() << L" [-pid product_id lead with '0x'] [-main main-ver, all version will be omitted if this was not given or be ZERO] [-cpu x86|x64] [-oem hw|lsc] [-only-twain change twain project only]\r\n"; cmd->release(); DWORD pid = process_util::get_parent_process(GetCurrentProcessId()); @@ -54,7 +54,7 @@ int main() } oem vendor = OEM_NONE; - bool x86 = true; + bool x86 = true, twain_only = cmd->has(L"-only-twain"); int main = 0, pid = 0x100; if (cmd->parameter(L"-main")) @@ -85,7 +85,7 @@ int main() std::wstring file(cmd->parameter(1)); STR_TO_ABSOLUTE_PATH(file); - set_ver(file.c_str(), vendor, x86, pid, main); + set_ver(file.c_str(), vendor, x86, pid, main, twain_only); cmd->release(); return 0; @@ -308,6 +308,11 @@ static bool change_product_id(std::wstring& brand, int pid) } namespace rc { + typedef struct _change_param + { + oem o; + int product_id; + }CHGPARAM, *LPCHGPARAM; static std::wstring load_file(const wchar_t* file, bom* bm) { std::string cont(""); @@ -568,11 +573,11 @@ namespace rc } } while (end); } - static bool change_file(const wchar_t* file, oem o, bool(__stdcall* modify)(std::wstring& cont, oem o)) + static bool change_file(const wchar_t* file, LPCHGPARAM param, bool(__stdcall* modify)(std::wstring& cont, LPCHGPARAM param)) { bom bm = BOM_UTF8; std::wstring cont(load_file(file, &bm)); - bool ret = modify(cont, o); + bool ret = modify(cont, param); if (ret) { @@ -790,9 +795,10 @@ namespace rc return true; } - bool __stdcall change_sane_def(std::wstring& cont, oem o) + bool __stdcall change_sane_def(std::wstring& cont, LPCHGPARAM param) { std::wstring backend(L"sane_"), prev(L"_hgsane_"); + oem o = param->o; if (o == OEM_HANWANG) backend.insert(0, L"_hw"); @@ -825,9 +831,10 @@ namespace rc return true; } - bool __stdcall change_device_def(std::wstring& cont, oem o) + bool __stdcall change_device_def(std::wstring& cont, LPCHGPARAM param) { std::wstring backend(L"_scanner_"), prev(L"hg_scanner_"); + oem o = param->o; if (o == OEM_HANWANG) backend.insert(0, L"hw"); @@ -860,10 +867,37 @@ namespace rc return true; } + bool __stdcall change_output(std::wstring& cont, LPCHGPARAM param) + { + std::wstring target(L"huagao"), first(L""), last(L""); + wchar_t tail[40] = { 0 }; + size_t bgn = 0, end = -1; + bool ok = false; + swprintf_s(tail, _countof(tail) - 1, L"twain%x.ds", param->product_id); + if (param->o == OEM_HANWANG) + target = L"hanvon"; + else if (param->o == OEM_LISICHENG) + target = L"lanxum"; + target += tail; + + while ((bgn = cont.find(first, bgn)) != std::wstring::npos) + { + bgn += first.length(); + end = cont.find(last, bgn); + if (end != std::wstring::npos) + { + ok = true; + cont.replace(bgn, end - bgn, target); + bgn += target.length() + last.length(); + } + } + + return ok; + } }; -static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main) +static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main, bool twain_only) { bool ret = false; bom bm = BOM_UTF8; @@ -891,14 +925,17 @@ static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main while (change_oem(unic, vendor)) { - if (main && !change_main(unic, main)) - break; - if (!change_sub(unic, sub, main)) - break; - if (!change_build(unic, build)) - break; - if (!change_patch(unic, patch)) - break; + if (!twain_only) + { + if (main && !change_main(unic, main)) + break; + if (!change_sub(unic, sub, main)) + break; + if (!change_build(unic, build)) + break; + if (!change_patch(unic, patch)) + break; + } if (!change_product_id(unic, pid)) break; @@ -922,39 +959,53 @@ static bool set_ver(const wchar_t* file, oem vendor, bool x86, int pid, int main file_util::save_2_file(cont.c_str(), cont.length(), file); std::wstring cn(L""), scn(L""), vs(L""), base(file), rcf(L""); + rc::CHGPARAM param; + param.o = vendor; + param.product_id = pid; STR_PARENT_FOLDER(base); if (rc::get_version_from_file(file, &main, &sub, &build, &patch, &cn, &scn, &vs)) { - rcf = base + L"\\..\\sane\\sane.vcxproj"; - STR_SIMPLIFY_PATH(rcf); - if(!rc::change_vcxproj_predefine(rcf.c_str(), vendor)) - std::wcout << "change predefines failed: " << rcf.c_str() << std::endl; + if (!twain_only) + { + rcf = base + L"\\..\\sane\\sane.vcxproj"; + STR_SIMPLIFY_PATH(rcf); + if (!rc::change_vcxproj_predefine(rcf.c_str(), vendor)) + std::wcout << "change predefines failed: " << rcf.c_str() << std::endl; - rcf = base + L"\\..\\sane\\sane.rc"; - STR_SIMPLIFY_PATH(rcf); - if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vs.c_str())) - std::wcout << "change version failed: " << rcf.c_str() << std::endl; + rcf = base + L"\\..\\sane\\sane.rc"; + STR_SIMPLIFY_PATH(rcf); + if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vs.c_str())) + std::wcout << "change version failed: " << rcf.c_str() << std::endl; - rcf = base + L"\\..\\sane\\sane.def"; + rcf = base + L"\\..\\sane\\sane.def"; + STR_SIMPLIFY_PATH(rcf); + if (!rc::change_file(rcf.c_str(), ¶m, rc::change_sane_def)) + std::wcout << "change exporting-definition failed: " << rcf.c_str() << std::endl; + + rcf = base + L"\\..\\device\\scanner.vcxproj"; + STR_SIMPLIFY_PATH(rcf); + if (!rc::change_vcxproj_predefine(rcf.c_str(), vendor)) + std::wcout << "change predefines failed: " << rcf.c_str() << std::endl; + + rcf = base + L"\\..\\device\\scanner.rc"; + STR_SIMPLIFY_PATH(rcf); + if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vs.c_str())) + std::wcout << "change version failed: " << rcf.c_str() << std::endl; + + rcf = base + L"\\..\\device\\device.def"; + STR_SIMPLIFY_PATH(rcf); + if (!rc::change_file(rcf.c_str(), ¶m, rc::change_device_def)) + std::wcout << "change exporting-definition failed: " << rcf.c_str() << std::endl; + } + + rcf = base + L"\\..\\twain\\twain.vcxproj"; STR_SIMPLIFY_PATH(rcf); - if(!rc::change_file(rcf.c_str(), vendor, rc::change_sane_def)) - std::wcout << "change exporting-definition failed: " << rcf.c_str() << std::endl; - - rcf = base + L"\\..\\device\\scanner.vcxproj"; - STR_SIMPLIFY_PATH(rcf); - if(!rc::change_vcxproj_predefine(rcf.c_str(), vendor)) - std::wcout << "change predefines failed: " << rcf.c_str() << std::endl; - - rcf = base + L"\\..\\device\\scanner.rc"; - STR_SIMPLIFY_PATH(rcf); - if (!rc::set_rc_ver(rcf.c_str(), main, sub, build, patch, cn.c_str(), scn.c_str(), vs.c_str())) - std::wcout << "change version failed: " << rcf.c_str() << std::endl; - - rcf = base + L"\\..\\device\\device.def"; - STR_SIMPLIFY_PATH(rcf); - if(!rc::change_file(rcf.c_str(), vendor, rc::change_device_def)) + if (!rc::change_file(rcf.c_str(), ¶m, rc::change_output)) + { std::wcout << "change exporting-definition failed: " << rcf.c_str() << std::endl; + ret = false; + } } else { diff --git a/twain/twain.vcxproj b/twain/twain.vcxproj index 0e66d03..9c2657e 100644 --- a/twain/twain.vcxproj +++ b/twain/twain.vcxproj @@ -49,6 +49,7 @@ $(SolutionDir)..\..\release\win\$(PlatformTarget)\$(Configuration)\ $(SolutionDir)..\..\tmp\$(PlatformTarget)\$(Configuration)\$(ProjectName)\ $(LibraryPath) + huagaotwain100.ds false @@ -56,6 +57,7 @@ $(SolutionDir)..\..\release\win\$(PlatformTarget)\$(Configuration)\ $(SolutionDir)..\..\tmp\$(PlatformTarget)\$(Configuration)\$(ProjectName)\ $(LibraryPath) + huagaotwain100.ds @@ -77,10 +79,11 @@ mkdir $(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration) -move /Y "$(OutDirFullPath)$(ProjectName).exp" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" -move /Y "$(OutDirFullPath)$(ProjectName).lib" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" -move /Y "$(OutDirFullPath)$(ProjectName).pdb" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" -copy $(TargetPath) $(WinDir)\twain_32\HuaGoScan\huagaotwain.ds /y +move /Y "$(OutDirFullPath)$(TargetName).exp" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" +move /Y "$(OutDirFullPath)$(TargetName).lib" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" +move /Y "$(OutDirFullPath)$(TargetName).pdb" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" +move /Y "$(TargetPath)" "$(OutDirFullPath)$(TargetName)" +copy "$(OutDirFullPath)$(TargetName)" "$(WinDir)\twain_32\HuaGoScan" /y @@ -106,10 +109,10 @@ copy $(TargetPath) $(WinDir)\twain_32\HuaGoScan\huagaotwain.ds /y mkdir $(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration) -move /Y "$(OutDirFullPath)$(ProjectName).exp" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" -move /Y "$(OutDirFullPath)$(ProjectName).lib" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" -move /Y "$(OutDirFullPath)$(ProjectName).pdb" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" -copy $(TargetPath) $(WinDir)\twain_32\HuaGoScan\$(ProjectName).ds /y +move /Y "$(OutDirFullPath)$(TargetName).exp" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" +move /Y "$(OutDirFullPath)$(TargetName).lib" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" +move /Y "$(OutDirFullPath)$(TargetName).pdb" "$(SolutionDir)..\..\sdk\lib\win\$(PlatformTarget)\$(Configuration)" +move /Y "$(TargetPath)" "$(OutDirFullPath)$(TargetName)"