// t1.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include #include #include #include #pragma warning(disable:4996) char * replaceAll(char * src, char oldChar, char newChar){ char * head = src; while (*src != '\0'){ if (*src == oldChar) *src = newChar; src++; } return head; } /** * * * 用新子串newstr替换源字符串src中所包含的oldstr子串 * * @param const char* src 源字符串,被替换的字符串 * @param const char* oldstr 旧的子串,将被替换的子串 * @param const char* newstr 新的子串 * * @return char* dest 返回新串的地址 * */ char *str_replace(const char *src, const char *oldstr, const char *newstr) { if (NULL == src || NULL == oldstr || NULL == newstr) { return NULL; } //从源串中拷贝一份到目的串 char *dest = strdup(src); //如果串相等,则直接返回 if (strcmp(oldstr, newstr) == 0) { return dest; } //子串位置指针 char *needle; //临时内存区 char *tmp, *dest_tmp = dest; //如果找到子串, 并且子串位置在前len个子串范围内, 则进行替换, 否则直接返回 while (needle = strstr(dest, oldstr)) { //分配新的空间: +1 是为了添加串尾的'\0'结束符 tmp = (char*)malloc(strlen(dest) + strlen(newstr) - strlen(oldstr) + 1); //把src内的前needle-dest个内存空间的数据,拷贝到arr strncpy(tmp, dest, needle - dest); //标识串结束 tmp[needle - dest] = '\0'; //连接arr和newstr, 即把newstr附在arr尾部, 从而组成新串(或说字符数组)arr strcat(tmp, newstr); //把src中 从oldstr子串位置后的部分和arr连接在一起,组成新串arr strcat(tmp, needle + strlen(oldstr)); //把用malloc分配的内存,复制给指针retv dest = strdup(tmp); free(dest_tmp); //释放malloc分配的内存空间 free(tmp); dest_tmp = dest; } return dest; } BOOL KillProcessByPID( DWORD dwPID) { HANDLE hProcess = ::OpenProcess( PROCESS_ALL_ACCESS, FALSE, dwPID); if ( hProcess) { ::TerminateProcess( hProcess, 0); ::CloseHandle( hProcess); return TRUE; } return FALSE; } int _tmain(int argc, char *argv[]) { char *FunName = argv[1]; char *ChmPath = argv[2]; if (NULL == FunName || ChmPath == NULL){ return 0; } DWORD dwPID = GetPrivateProfileInt("pid", "val", 0, "c:\\qq.ini"); if ( dwPID != 0 ) { KillProcessByPID( dwPID); } FunName = replaceAll(FunName, '_', '-');//替换为正确的php函数名称 STARTUPINFO si = { 0 }; PROCESS_INFORMATION pi = { 0 }; si.cb = sizeof si; char cmd[260] = { 0 }; sprintf_s( cmd, "hh mk:@MSITStore:%s::/res/function.%s.html",ChmPath, FunName); //system( cmd); if ( CreateProcess( 0, cmd, NULL, NULL, FALSE, 0, NULL, NULL, &si, &pi) ) { char val[32] = { 0 }; sprintf_s( val, "%d", pi.dwProcessId); WritePrivateProfileString( "pid", "val", val, "c:\\qq.ini" ); } return 0; }