添加IP/序列号/固件版本……扩展属性(8800后)访问接口;设备未连接时增加提示

This commit is contained in:
gb 2023-05-20 11:05:06 +08:00
parent 7fbda30161
commit df75ae1e18
5 changed files with 75 additions and 11 deletions

View File

@ -434,7 +434,7 @@ extern "C"
#else
__declspec(dllimport)
#endif
int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker);
int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker, bool last_try);
#ifdef EXPORT_SANE_API
__declspec(dllexport)
#else

View File

@ -3431,13 +3431,27 @@ extern "C"
#else
__declspec(dllimport)
#endif
int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker)
int __stdcall open_scanner(SCANNERID scanner_id, ISaneInvoker** invoker, bool last_try)
{
if (!invoker)
return SCANNER_ERR_INVALID_PARAMETER;
if (!is_scanner_online(scanner_id))
{
if (last_try)
{
HWND parent = callback::find_main_wnd();
std::string msg(callback::language_trans("\xE6\xB2\xA1\xE6\x9C\x89\xE6\x89\xBE\xE5\x88\xB0\xE6\x89\xAB\xE6\x8F\x8F\xE4\xBB\xAA\xEF\xBC\x81", true, NULL)),
title(callback::language_trans("\xE9\x94\x99\xE8\xAF\xAF", true, NULL));
if (callback::show_messagebox_ui)
callback::show_messagebox_ui(parent, 0, &msg[0], SCANNER_ERR_DEVICE_NOT_FOUND);
else
MessageBoxW(parent, local_trans::a2u(msg.c_str(), CP_UTF8).c_str(), local_trans::a2u(title.c_str(), CP_UTF8).c_str(), MB_OK);
}
return SCANNER_ERR_DEVICE_NOT_FOUND;
}
scanner* scn = new scanner(scanner_id);
if (scn->last_error() == SCANNER_ERR_OK)
@ -3448,10 +3462,20 @@ extern "C"
}
else
{
int ret = scn->last_error();
int ret = scn->last_error();
scn->release();
*invoker = NULL;
if (last_try)
{
HWND parent = callback::find_main_wnd();
std::string msg(callback::language_trans("\xE6\x89\x93\xE5\xBC\x80\xE6\x89\xAB\xE6\x8F\x8F\xE4\xBB\xAA\xE5\xA4\xB1\xE8\xB4\xA5\xE3\x80\x82", true, NULL)),
title(callback::language_trans("\xE9\x94\x99\xE8\xAF\xAF", true, NULL));
if (callback::show_messagebox_ui)
callback::show_messagebox_ui(parent, 0, &msg[0], ret);
else
MessageBoxW(parent, local_trans::a2u(msg.c_str(), CP_UTF8).c_str(), local_trans::a2u(title.c_str(), CP_UTF8).c_str(), MB_OK);
}
return ret;
}

View File

@ -10,7 +10,7 @@ namespace load_sane_util
{
static std::wstring sane_path(L"");
static HMODULE sane_module(NULL);
static int (__stdcall* sane_inst)(SCANNERID, ISaneInvoker**) = NULL;
static int (__stdcall* sane_inst)(SCANNERID, ISaneInvoker**, bool) = NULL;
static int(__stdcall* is_on)(SCANNERID) = NULL;
static int(__stdcall* init)(void*) = NULL;
static int(__stdcall* uninit)(void*) = NULL;
@ -87,6 +87,25 @@ namespace load_sane_util
return reg_read(HKEY_LOCAL_MACHINE, path.c_str(), key.c_str());
}
std::string to_web_utf(const std::wstring& unic)
{
std::string webu("");
char buf[20] = { 0 };
for (size_t i = 0; i < unic.length(); ++i)
{
wchar_t v = unic[i];
if (v <= 0x7f)
webu.append(1, (char)v);
else
{
sprintf_s(buf, _countof(buf) - 1, "\\u%04X", v);
webu += buf;
}
}
return webu;
}
static int load_dll(const wchar_t* path_dll, HMODULE* dll)
{
HMODULE h = LoadLibraryW(path_dll);
@ -166,7 +185,7 @@ namespace load_sane_util
else
return false;
}
ISaneInvoker* open(SCANNERID guid, int* err)
ISaneInvoker* open(SCANNERID guid, int* err, bool last_try)
{
ISaneInvoker* ret = NULL;
int code = 0;
@ -175,7 +194,7 @@ namespace load_sane_util
err = &code;
if (sane_inst)
*err = sane_inst(guid, &ret);
*err = sane_inst(guid, &ret, last_try);
return ret;
}
@ -244,3 +263,4 @@ namespace load_sane_util
return ret;
}
};

View File

@ -10,7 +10,7 @@ namespace load_sane_util
bool initialize(HMODULE me);
bool is_ok(void);
bool is_online(SCANNERID guid);
ISaneInvoker* open(SCANNERID guid, int* err);
ISaneInvoker* open(SCANNERID guid, int* err, bool last_try);
void uninitialize(void);
void log_info(const wchar_t* info, int level);
@ -20,5 +20,15 @@ namespace load_sane_util
int move_file(const char* from, const char* to);
int move_file(const wchar_t* from, const wchar_t* to);
template<typename ... Args>
void to_log(const wchar_t* fmt, Args ... args)
{
size_t size = swprintf(nullptr, 0, fmt, args ...) + 2;
std::unique_ptr<wchar_t[]> buf(new wchar_t[size]);
swprintf(buf.get(), size, fmt, args ...);
log_info(buf.get(), 0);
}
};

View File

@ -963,10 +963,10 @@ Result huagao_ds::identityOpenDs(const Identity& id)
return result;
}
int err = 0, attempt = 0;
int err = 0, attempt = 0, max_try = 100;
// Sleep(500);
scanner_.reset(load_sane_util::open(scanner_guid, &err));
while (err == SCANNER_ERR_DEVICE_NOT_FOUND && attempt++ < 100)
scanner_.reset(load_sane_util::open(scanner_guid, &err, false));
while (err == SCANNER_ERR_DEVICE_NOT_FOUND && attempt++ < max_try)
{
if (attempt == 1)
{
@ -974,7 +974,7 @@ Result huagao_ds::identityOpenDs(const Identity& id)
}
std::this_thread::sleep_for(std::chrono::milliseconds(5));
err = 0;
scanner_.reset(load_sane_util::open(scanner_guid, &err));
scanner_.reset(load_sane_util::open(scanner_guid, &err, attempt >= max_try));
}
if (!scanner_.get())
{
@ -3057,6 +3057,16 @@ void huagao_ds::init_support_caps(void)
SET_EXISTING_EXTENSION(BKG_COLOR_RANGE, CapTypeEx::CAP_TYPE_EX_FADE_BKG_VALUE);
SET_EXISTING_EXTENSION(SIZE_CHECK, CapTypeEx::CAP_TYPE_EX_SIZE_DETECT);
SET_EXISTING_EXTENSION(IS_MULTI_OUT, CapTypeEx::CAP_TYPE_EX_MULTI_OUT);
m_query[(CapType)SANE_OPT_ID_DEVICE_SERIAL_NO] = m_query[CapType::SerialNumber];
m_caps[(CapType)SANE_OPT_ID_DEVICE_SERIAL_NO] = m_caps[CapType::SerialNumber];
m_query[(CapType)SANE_OPT_ID_FIRMWARE_VERSION] = m_query[(CapType)CapTypeEx::CAP_TYPE_EX_HARDWARE_VERSION];
m_caps[(CapType)SANE_OPT_ID_FIRMWARE_VERSION] = m_caps[(CapType)CapTypeEx::CAP_TYPE_EX_HARDWARE_VERSION];
m_query[(CapType)SANE_OPT_ID_DEVICE_IP_ADDR] = m_query[(CapType)CapTypeEx::CAP_TYPE_EX_IP];
m_caps[(CapType)SANE_OPT_ID_DEVICE_IP_ADDR] = m_caps[(CapType)CapTypeEx::CAP_TYPE_EX_IP];
}
void huagao_ds::init_support_caps_ex(void)
{