/* ======================================= 命令行主函数 ======================================= */ int main (int argc, char *argv[]) { sCP_PARAM ft; /* 建立 CrHack 系统 */ if (!set_app_type(CR_APP_CUI)) return (QST_ERROR); /* 参数解析 <源编码> <目标编码> <搜索根目录> <通配符> */ if (argc < 5) { usage(); return (QST_ERROR); } /* 填充结构 */ ft.tot = ft.cvt = 0; ft.from = str2intA(argv[1]); if (ft.from == CR_LOCAL) ft.from = get_sys_codepage(); ft.to = str2intA(argv[2]); if (ft.to == CR_LOCAL) ft.to = get_sys_codepage(); /* 已经是 UTF-8 的文件不用转换 */ if (ft.to == CR_UTF8) ft.skip_utf8 = TRUE; else ft.skip_utf8 = FALSE; /* 两个编码值相等表示删除 UTF-8 BOM 标志 */ if (ft.from == ft.to) ft.del_u8_bom = TRUE; else ft.del_u8_bom = FALSE; /* 子目录递归 + 跳过隐藏目录和文件 */ file_searchA(argv[3], TRUE, TRUE, FALSE, argv[4], do_each_file, &ft); printf("%u file(s) found. %u file(s) converted.\n", ft.tot, ft.cvt); return (QST_OKAY); }
/* --------------------------------------- 设置显示文本编码 --------------------------------------- */ static bool_t qst_com_cpage ( __CR_IN__ void_t* parm, __CR_IN__ uint_t argc, __CR_IN__ ansi_t** argv ) { uint_t page; /* 参数解析 <编码> */ if (argc < 2) return (FALSE); page = str2intxA(argv[1]); if (page == CR_LOCAL) page = get_sys_codepage(); else if (is_cr_widechar(page)) page = CR_UTF8; ((sQstComm*)parm)->page = page; return (TRUE); }
/* ======================================= WinMain 程序入口 ======================================= */ int WINAPI WinMain ( __CR_IN__ HINSTANCE curt_app, __CR_IN__ HINSTANCE prev_app, __CR_IN__ LPSTR cmd_line, __CR_IN__ int cmd_show ) { uint_t argc; ansi_t** argv; CR_NOUSE(prev_app); CR_NOUSE(cmd_show); /* 只允许一个例程 */ if (misc_is_running(EXE_XNAME)) return (QST_ERROR); /* 建立 CrHack 系统 */ if (!set_app_type(CR_APP_GUI)) return (QST_ERROR); mem_zero(&s_wrk_ctx, sizeof(s_wrk_ctx)); int qt_argc; /* 获取命令行参数, 不包括进程文件名 */ argv = misc_get_param(cmd_line, &argc); qt_argc = (int)argc; QApplication qt_app(qt_argc, argv); qt_app.setApplicationName("QstComm"); qt_app.setOrganizationName("QuestLAB"); sint_t x1, y1; uint_t ww, hh; /* 生成一个可变大小的窗口 */ mtlock_init(&s_wrk_ctx.lock); qst_load_cfg(&s_wrk_ctx.cfgs); misc_desk_init(WIN_ICONF, &x1, &y1, &ww, &hh, QCOM_DEF_WIDTH, QCOM_DEF_HEIGHT); if (ww < QCOM_DEF_WIDTH) ww = QCOM_DEF_WIDTH; if (hh < QCOM_DEF_HEIGHT) hh = QCOM_DEF_HEIGHT; RECT w_rect; sint_t fw, fh; QMainWindow qt_win; /* Qt 里的宽高都不包括边框 需要自己用 Win32 API 获取 */ qt_win.setWindowFlags(qt_win.windowFlags() & (~Qt::WindowMaximizeButtonHint)); qt_win.move(x1, y1); qt_win.resize(ww, hh); s_wrk_ctx.hwnd = (HWND)qt_win.winId(); if (!GetWindowRect(s_wrk_ctx.hwnd, &w_rect)) return (QST_ERROR); fw = w_rect.right - w_rect.left - ww; fh = w_rect.bottom - w_rect.top - hh; qt_win.setMinimumSize(QCOM_DEF_WIDTH - fw, QCOM_DEF_HEIGHT - fh); qt_win.resize(ww - fw, hh - fh); QWidget* cent = new QWidget (&qt_win); CTextEdit* edit = new CTextEdit (cent); QHBoxLayout* hori = new QHBoxLayout (cent); /* 创建窗体里的控件 */ hori->setSpacing(6); hori->setContentsMargins(8, 8, 8, 8); hori->addWidget(edit); qt_win.setCentralWidget(cent); CTextOper oper(&qt_win, edit); s_wrk_ctx.oper = (void_t*)(&oper); SetClassLongPtr(s_wrk_ctx.hwnd, GCLP_HICON, (LONG_PTR) LoadIconA(curt_app, (ansi_t*)101)); /* 初始化 ANSI 上下文 */ if (!qst_csi_init()) return (QST_ERROR); qst_set_viewer(&s_wrk_ctx); /* 初始化网络 */ if (!socket_init()) return (QST_ERROR); s_wrk_ctx.netw = netw_cli_open(EXE_XNAME); if (s_wrk_ctx.netw == NULL) return (QST_ERROR); /* 读取需要超时, 不然线程无法退出 */ socket_set_timeout(s_wrk_ctx.netw, -1, QST_TCP_TOUT); thrd_t thrd; /* 生成工作线程 */ s_wrk_ctx.quit = FALSE; s_wrk_ctx.comm.quit = FALSE; s_wrk_ctx.comm.text = TRUE; s_wrk_ctx.comm.rtype = "text"; s_wrk_ctx.comm.stype = "text"; s_wrk_ctx.comm.title = NULL; s_wrk_ctx.comm.render = qst_txt_show; s_wrk_ctx.page = get_sys_codepage(); qst_update_title(&s_wrk_ctx); thrd = thread_new(0, qst_com_main, &s_wrk_ctx, FALSE); if (thrd == NULL) return (QST_ERROR); sio_init(); /* 开始 Qt 流程 */ qt_win.show(); qt_app.exec(); /* 关闭线程直接退出 */ if (!s_wrk_ctx.quit) s_wrk_ctx.quit = TRUE; thread_wait(thrd); thread_del(thrd); netw_cli_close(s_wrk_ctx.netw); sio_free(); qst_csi_free(); return (QST_OKAY); }