diff --git a/client/CaptureVideo.h b/client/CaptureVideo.h index 14b36f2..a242c52 100644 --- a/client/CaptureVideo.h +++ b/client/CaptureVideo.h @@ -18,10 +18,15 @@ #pragma comment(lib,"Strmiids.lib") +// TODO 全局变量, 定义位置:qedit.h + +// 接口 ID 回调接口,用于在每一帧抓取时通知应用 EXTERN_C const IID IID_ISampleGrabberCB; +// 类 ID 创建 Sample Grabber COM 对象 EXTERN_C const CLSID CLSID_SampleGrabber; +// 接口 ID 设置 Sample Grabber 的参数、格式、回调等操作接口 EXTERN_C const IID IID_ISampleGrabber; struct ISampleGrabberCB : public IUnknown @@ -35,7 +40,6 @@ public: double SampleTime, BYTE* pBuffer, long BufferLen) = 0; - }; struct ISampleGrabber : public IUnknown diff --git a/client/ClientDll.cpp b/client/ClientDll.cpp index b7680b4..5d2d557 100644 --- a/client/ClientDll.cpp +++ b/client/ClientDll.cpp @@ -265,6 +265,8 @@ int main(int argc, const char *argv[]) status = E_STOP; CloseHandle(hMutex); + Logger::getInstance().stop(); + return 0; } #else diff --git a/client/Common.cpp b/client/Common.cpp index d47cfa0..bab3eb7 100644 --- a/client/Common.cpp +++ b/client/Common.cpp @@ -16,80 +16,6 @@ #include "KernelManager.h" #include -#define REG_SETTINGS "Software\\ServerD11\\Settings" - -// 写入字符串配置(多字节版) -bool WriteAppSettingA(const std::string& keyName, const std::string& value) { - HKEY hKey; - - LONG result = RegCreateKeyExA( - HKEY_CURRENT_USER, - REG_SETTINGS, - 0, - NULL, - 0, - KEY_WRITE, - NULL, - &hKey, - NULL - ); - - if (result != ERROR_SUCCESS) { - Mprintf("无法创建或打开注册表键,错误码: %d\n", result); - return false; - } - - result = RegSetValueExA( - hKey, - keyName.c_str(), - 0, - REG_SZ, - reinterpret_cast(value.c_str()), - static_cast(value.length() + 1) - ); - - RegCloseKey(hKey); - return result == ERROR_SUCCESS; -} - -// 读取字符串配置(多字节版) -bool ReadAppSettingA(const std::string& keyName, std::string& outValue) { - HKEY hKey; - - LONG result = RegOpenKeyExA( - HKEY_CURRENT_USER, - REG_SETTINGS, - 0, - KEY_READ, - &hKey - ); - - if (result != ERROR_SUCCESS) { - return false; - } - - char buffer[256]; - DWORD bufferSize = sizeof(buffer); - DWORD type = 0; - - result = RegQueryValueExA( - hKey, - keyName.c_str(), - nullptr, - &type, - reinterpret_cast(buffer), - &bufferSize - ); - - RegCloseKey(hKey); - - if (result == ERROR_SUCCESS && type == REG_SZ) { - outValue = buffer; - return true; - } - - return false; -} DWORD WINAPI ThreadProc(LPVOID lParam) { diff --git a/client/Common.h b/client/Common.h index 2b7e6d1..d7c5b3e 100644 --- a/client/Common.h +++ b/client/Common.h @@ -18,11 +18,6 @@ typedef struct UserParam ~UserParam() { SAFE_DELETE_ARRAY(buffer); } }UserParam; -// 写入配置 -bool WriteAppSettingA(const std::string& keyName, const std::string& value); -// 读取配置 -bool ReadAppSettingA(const std::string& keyName, std::string& outValue); - DWORD WINAPI ThreadProc(LPVOID lParam); DWORD WINAPI LoopShellManager(LPVOID lParam); diff --git a/client/IOCPClient.cpp b/client/IOCPClient.cpp index b7b30ed..ab02689 100644 --- a/client/IOCPClient.cpp +++ b/client/IOCPClient.cpp @@ -344,6 +344,19 @@ DWORD WINAPI IOCPClient::WorkThreadProc(LPVOID lParam) return 0xDEAD; } +// 带异常处理的数据处理逻辑: +// 如果 f 执行时 没有触发系统异常(如访问冲突),返回 0 +// 如果 f 执行过程中 抛出了异常(比如空指针访问),将被 __except 捕获,返回异常码(如 0xC0000005 表示访问违规) +int DataProcessWithSEH(DataProcessCB f, void* manager, LPBYTE data, ULONG len) { + __try { + if (f) f(manager, data, len); + return 0; + } + __except (EXCEPTION_EXECUTE_HANDLER) { + return GetExceptionCode(); + } +} + VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) { @@ -394,8 +407,10 @@ VOID IOCPClient::OnServerReceiving(char* szBuffer, ULONG ulLength) { //解压好的数据和长度传递给对象Manager进行处理 注意这里是用了多态 //由于m_pManager中的子类不一样造成调用的OnReceive函数不一样 - if (m_DataProcess) - m_DataProcess(m_Manager, (PBYTE)DeCompressedBuffer, ulOriginalLength); + int ret = DataProcessWithSEH(m_DataProcess, m_Manager, DeCompressedBuffer, ulOriginalLength); + if (ret) { + Mprintf("[ERROR] DataProcessWithSEH return exception code: [0x%08X]\n", ret); + } } else{ Mprintf("[ERROR] uncompress fail: dstLen %d, srcLen %d\n", ulOriginalLength, ulCompressedLength); diff --git a/client/LoginServer.cpp b/client/LoginServer.cpp index b3cdf0d..6fa6a42 100644 --- a/client/LoginServer.cpp +++ b/client/LoginServer.cpp @@ -254,11 +254,11 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn) GetModuleFileNameA(NULL, buf, sizeof(buf)); LoginInfor.AddReserved(buf); // 文件路径 LoginInfor.AddReserved("?"); // test - std::string installTime; - auto b = ReadAppSettingA("install_time", installTime); - if (!b || installTime.empty()) { - installTime = ToPekingTimeAsString(nullptr);; - WriteAppSettingA("install_time", installTime); + iniFile cfg(CLIENT_PATH); + std::string installTime = cfg.GetStr("settings", "install_time"); + if (installTime.empty()) { + installTime = ToPekingTimeAsString(nullptr); + cfg.SetStr("settings", "install_time", installTime); } LoginInfor.AddReserved(installTime.c_str()); // 安装时间 LoginInfor.AddReserved("?"); // 安装信息 @@ -285,7 +285,6 @@ LOGIN_INFOR GetLoginInfo(DWORD dwSpeed, const CONNECT_ADDRESS& conn) strcmp(conn.szFlag, skCrypt("Happy New Year!")) == 0; const char* id = isDefault ? masterHash.c_str() : conn.szFlag; memcpy(LoginInfor.szMasterID, id, min(strlen(id), 16)); - iniFile cfg(CLIENT_PATH); std::string loc = cfg.GetStr("settings", "location", ""); std::string pubIP = cfg.GetStr("settings", "public_ip", ""); IPConverter cvt;