diff --git a/hgdriver/hgdev/hg_scanner.cpp b/hgdriver/hgdev/hg_scanner.cpp index a92bbc0..7629c7d 100644 --- a/hgdriver/hgdev/hg_scanner.cpp +++ b/hgdriver/hgdev/hg_scanner.cpp @@ -1,4 +1,4 @@ -#include "hg_scanner.h" +#include "hg_scanner.h" #include "../wrapper/hg_log.h" #include "sane/sane_option_definitions.h" #include "scanner_setting.h" @@ -1475,16 +1475,92 @@ int hg_scanner::setting_restore(void* data, long* len) return SCANNER_ERR_CONFIGURATION_CHANGED; } + +static int GetModuleName(void* addr, char* name, int maxLen) +{ + if (NULL == name || 0 == maxLen) + { + return -1; + } + +#if !defined(_WIN32) + if (NULL == addr) + { + char dir[PATH_MAX] = { 0 }; + if (0 == readlink("/proc/self/exe", dir, PATH_MAX)) + return -1; + if (maxLen < strlen(dir) + 1) + return -1; + strcpy(name, dir); + } + else + { + Dl_info dlinfo; + if (0 == dladdr(addr, &dlinfo)) + return -1; + if (maxLen < strlen(dlinfo.dli_fname) + 1) + return -1; + strcpy(name, dlinfo.dli_fname); + } +#else + HMODULE hModule = NULL; + GetModuleHandleExA(GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS + | GET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT, (LPCSTR)addr, &hModule); + + CHAR moduleName[MAX_PATH] = { 0 }; + DWORD len = GetModuleFileNameA(hModule, moduleName, MAX_PATH); + if (0 == len || maxLen < strlen(moduleName) + 1) + return -1; + strcpy(name, moduleName); +#endif + return 0; +} + +static int GetFilePath(const char* fileName, char* path, int maxLen) +{ + if (NULL == fileName || NULL == path || 0 == maxLen) + { + return -1; + } + +#if defined(_WIN32) + const char* pcName = strrchr(fileName, '\\'); + if (NULL == pcName) + { + pcName = strrchr(fileName, '/'); + if (NULL == pcName) + return -1; + } +#else + const char* pcName = strrchr(fileName, '/'); + if (NULL == pcName) + return -1; +#endif + + ++pcName; + if (maxLen < (int)(pcName - fileName + 1)) + return -1; + memcpy(path, fileName, pcName - fileName); + path[pcName - fileName] = 0; + return 0; +} + int hg_scanner::setting_help(void* data, long* len) { - std::string helpfile = HELP_PATH; + char moduleName[256]; + GetModuleName(NULL, moduleName, 256); + char exePath[256]; + GetFilePath(moduleName, exePath, 256); + std:string exePath2 = exePath; + + std::string helpfile = exePath2 + HELP_PATH; std::string com = "xdg-open ";//注意空格保留 int code_page = lang_get_cur_code_page(); int ret = SCANNER_ERR_OK; if (code_page == 20127) { - helpfile = HELP_PATH_EN; + helpfile = exePath2 + HELP_PATH_EN; } #if defined(WIN32) || defined(_WIN64)