在使用大小写不敏感函数比较字符串时,很顺手的来了个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;