在使用大小写不敏感函数比较字符串时,很顺手的来了个stricmp,g++编译的时候:错误:‘stricmp’在此作用域中尚未声明。后来查了一下,stricmp是windows特有的。而linux是strcasecmp,包含在头文件string.h下。问题解决了...
找了老半天都没有windows版本的cjson.dll库,只能手动编译。 下载:http://www.kyne.com.au/~mark/software/lua-cjson.php 转换为vs2005工程后编译出错,把所有static inline的函数修改为static的,把一些不存在的api添加为windows下带下划线的版本,strncasecmp替换为 stricmp 创建模块定义文件(.def),内容: LIBRARY "cjson" EXPORTS luaopen_cjson 也就是要导出luaopen_cjson函数。
用久了eclipse,所以就继续使用Eclipse CDT环境学习C++。 今天按照《Thinking in C++》 的实例调代码, 提示错误:错误:‘strcpy’在此 作用 尚未 声明 修改方法: #include #include 问题就 解决 了。接触C和C++比较少,现在还不明白要为什么这么改,是编译器版
这是由于gcc编译器版本太新, 解决 方法是打开makefile搜索并替换 NVCCFLAGS += -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS) NVCCFLAGS += -D_FORCE_INLINES -ccbin=$(CXX) -Xcompiler -fPIC $(COMMON_FLAGS)
1. 创建一个Windows服务程序的工程,并添加头文件和库文件。 2. 在服务程序的入口函数 ,调用StartServiceCtrlDispatcher函数来注册服务控制处理函数。 3. 实现服务控制处理函数,在处理函数 实现服务的启动、停止、暂停、继续等操作。 4. 在服务启动时,读取.txt文件 的进程名和绝对路径,并将其保存到一个数据结构 ,例如一个vector。 5. 使用CreateToolhelp32Snapshot函数获取系统 正在运行的进程列表,并与保存在数据结构 的进程名进行比较,判断进程是否在运行。 6. 如果进程不在运行,则使用CreateProcess函数启动进程。 7. 使用定时器功能,定时监控进程是否在运行,如果不在运行,则重启进程。 8. 在服务停止时,释放资源并结束服务。 下面是一个简单的代码示例,仅供参考: ```cpp #include <windows.h> #include <tchar.h> #include <vector> #include <string> #include <fstream> #include <tlhelp32.h> #define SERVICE_NAME _T("ProcessMon") SERVICE_STATUS g_ServiceStatus = {0}; SERVICE_STATUS_HANDLE g_StatusHandle = NULL; HANDLE g_ServiceStopEvent = INVALID_HANDLE_VALUE; std::vector<std::pair<std::string, std::string>> g_ProcessList; VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv); VOID WINAPI ServiceCtrlHandler(DWORD); DWORD WINAPI ServiceWorkerThread(LPVOID lpParam); BOOL GetProcessPath(DWORD dwProcessId, std::string& path); int _tmain(int argc, TCHAR* argv[]) SERVICE_TABLE_ENTRY ServiceTable[] = {SERVICE_NAME, (LPSERVICE_MAIN_FUNCTION) ServiceMain}, {NULL, NULL} if (StartServiceCtrlDispatcher(ServiceTable) == FALSE) return GetLastError(); return 0; VOID WINAPI ServiceMain(DWORD argc, LPTSTR* argv) DWORD Status = E_FAIL; g_StatusHandle = RegisterServiceCtrlHandler(SERVICE_NAME, ServiceCtrlHandler); if (g_StatusHandle == NULL) goto EXIT; g_ServiceStatus.dwServiceType = SERVICE_WIN32_OWN_PROCESS; g_ServiceStatus.dwServiceSpecificExitCode = 0; g_ServiceStatus.dwCurrentState = SERVICE_START_PENDING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); g_ServiceStopEvent = CreateEvent(NULL, TRUE, FALSE, NULL); if (g_ServiceStopEvent == NULL) g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); goto EXIT; g_ServiceStatus.dwControlsAccepted = SERVICE_ACCEPT_STOP | SERVICE_ACCEPT_PAUSE_CONTINUE; g_ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); HANDLE hThread = CreateThread(NULL, 0, ServiceWorkerThread, NULL, 0, NULL); WaitForSingleObject(hThread, INFINITE); CloseHandle(g_ServiceStopEvent); g_ServiceStatus.dwCurrentState = SERVICE_STOPPED; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); EXIT: return; VOID WINAPI ServiceCtrlHandler(DWORD CtrlCode) switch (CtrlCode) case SERVICE_CONTROL_STOP: if (g_ServiceStatus.dwCurrentState != SERVICE_RUNNING) break; g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); SetEvent(g_ServiceStopEvent); break; case SERVICE_CONTROL_PAUSE: g_ServiceStatus.dwCurrentState = SERVICE_PAUSED; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); break; case SERVICE_CONTROL_CONTINUE: g_ServiceStatus.dwCurrentState = SERVICE_RUNNING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); break; case SERVICE_CONTROL_SHUTDOWN: g_ServiceStatus.dwCurrentState = SERVICE_STOP_PENDING; SetServiceStatus(g_StatusHandle, &g_ServiceStatus); SetEvent(g_ServiceStopEvent); break; default: break; DWORD WINAPI ServiceWorkerThread(LPVOID lpParam) std::ifstream file("process_list.txt"); std::string line; while (std::getline(file, line)) size_t pos = line.find(","); if (pos != std::string::npos) std::string processName = line.substr(0, pos); std::string processPath = line.substr(pos + 1); g_ProcessList.push_back(std::make_pair(processName, processPath)); while (WaitForSingleObject(g_ServiceStopEvent, 0) != WAIT_OBJECT_0) for (auto& process : g_ProcessList) DWORD dwProcessId = 0; HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); PROCESSENTRY32 pe32 = {0}; pe32.dwSize = sizeof(PROCESSENTRY32); if (Process32First(hSnapshot, &pe32)) if (_ stricmp (pe32.szExeFile, process.first.c_str()) == 0) dwProcessId = pe32.th32ProcessID; break; } while (Process32Next(hSnapshot, &pe32)); CloseHandle(hSnapshot); if (dwProcessId == 0) STARTUPINFO si = {0}; PROCESS_INFORMATION pi = {0}; si.cb = sizeof(STARTUPINFO); TCHAR szCmdline[MAX_PATH]; snprintf(szCmdline, MAX_PATH, "%s", process.second.c_str()); if (CreateProcess(NULL, szCmdline, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi)) CloseHandle(pi.hProcess); CloseHandle(pi.hThread); Sleep(5000); return ERROR_SUCCESS; BOOL GetProcessPath(DWORD dwProcessId, std::string& path) HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, dwProcessId); if (hProcess == NULL) return FALSE; TCHAR szPath[MAX_PATH]; DWORD dwSize = MAX_PATH; if (QueryFullProcessImageName(hProcess, 0, szPath, &dwSize)) path = szPath; return TRUE; CloseHandle(hProcess); return FALSE;