VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 1075|回复: 1

[求助] 两次调用CreateMutex没有产生互斥

[复制链接]
69_avatar_middle
在线会员 发表于 2016-12-20 18:42:37 | 显示全部楼层 |阅读模式
3驿站币
第一次成功启动以后可以在服务里看到,抓包可以看到我在开启的服务中创建的ping线程一直在工作。
但是第二次运行该程序,CreateMutex还是返回了一个句柄,并没有返回ERROR_ALREADY_EXISTS。

代码如下
  1. int main(int argc,char *argv[])
  2. {
  3.         Register();
  4.         SERVICE_TABLE_ENTRY   DispatchTable[] =
  5.         {
  6.                 { "Temp_For_Test", (LPSERVICE_MAIN_FUNCTION) ServiceMain },
  7.                 { NULL, NULL }
  8.         };
  9.         if (!StartServiceCtrlDispatcher( DispatchTable))
  10.         {
  11.                 printf("error :%d\n",GetLastError());
  12.         }
  13.         while(1);

  14.         system("pause");
  15. //        while(1);
  16.         return 0;
  17. }

  18. void Register()
  19. {
  20.         HANDLE hMutex=CreateMutex(0,true,"four_glass");
  21.         if(GetLastError()==ERROR_ALREADY_EXISTS)
  22.         {
  23.                 MessageBox(NULL, "已有该实例", "注意:", MB_OK);
  24.                 exit(0);
  25.         }

  26.         //check whether installed in Service. if not, install
  27.         InstallService();//该函数功能为创建服务,然后启动服务,exit退出。  里面还有不明白的地方,还请指教
  28. }


  29. void InstallService(void)
  30. {
  31.         const char ServiceName[]="Temp_For_Test";
  32.         char FilePathName[MAX_PATH];
  33.         SERVICE_STATUS_PROCESS s_Status;
  34.         SC_HANDLE h_SCManager;
  35.         SC_HANDLE h_Service;
  36.         DWORD dwBytesNeeded;
  37.         DWORD dwOldCheckPoint;
  38.         DWORD dwStartTickCount;
  39.         DWORD dwWaitTime;

  40.         GetModuleFileName(NULL, FilePathName, MAX_PATH);                                                //获得自身路径

  41.         h_SCManager=OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);                        //打开SCM
  42.         if (NULL == h_SCManager)
  43.         {
  44.                 printf("OpenSCManager failed (%d)\n", GetLastError());
  45.                 exit(0);
  46.         }
  47.         else
  48.                 printf("OpenSCManager succeeded\n");


  49.         //query if the service exist.
  50.         h_Service = OpenService(h_SCManager, ServiceName, SC_MANAGER_ALL_ACCESS);
  51.         if (h_Service != NULL)
  52.     {
  53.                 printf("OpenService succeeded\n");

  54.                 if (!QueryServiceStatusEx(h_Service, SC_STATUS_PROCESS_INFO, (LPBYTE)&s_Status, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded ) )            
  55.                                                          // handle to service // info level  // address of structure // size of structure  // if buffer too small
  56.                 {
  57.                         printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
  58.                         exit(0);
  59.                 }

  60.                 CloseServiceHandle(h_Service);
  61.                 CloseServiceHandle(h_SCManager);
  62.                 return ;
  63.     }
  64.         else
  65.         {
  66.                 printf("OpenService failed:%d\n",GetLastError());
  67.         }
  68.        

  69.         h_Service=CreateService(                                                                                                //创建服务
  70.                 h_SCManager,                                // SCM 句柄
  71.                 ServiceName,                                // 服务名
  72.                 ServiceName,                            // 显示的服务名
  73.                 SERVICE_ALL_ACCESS,                        // 存取权限
  74.                 SERVICE_WIN32_OWN_PROCESS,        // 服务类别
  75.                 SERVICE_AUTO_START,                        // 启动类别
  76.                 SERVICE_ERROR_NORMAL,                // 错误控制类别
  77.                 FilePathName,                                // 服务的可执行文件路径
  78.                 NULL,                                                // no load ordering group
  79.                 NULL,                                                // no tag identifier
  80.                 NULL,                                                // no dependencies
  81.                 NULL,                                                // LocalSystem account
  82.                 NULL);                                                // no password
  83.         if (NULL == h_Service)
  84.         {
  85.                 printf("CreateService failed (%d)\n", GetLastError());
  86.                 exit(0);
  87.         }
  88.         else
  89.                 printf("CreateService succeeded\n");

  90.         if(!StartService(h_Service, 0, NULL))                                                                        //启动服务
  91.         {
  92.                 printf("StartService failed (%d)\n", GetLastError());
  93.                 exit(0);
  94.         }

  95.                                                                                                                                                         //查询状态
  96.         if (!QueryServiceStatusEx(h_Service, SC_STATUS_PROCESS_INFO, (LPBYTE)&s_Status, sizeof(SERVICE_STATUS_PROCESS), &dwBytesNeeded ) )            
  97.                                                  // handle to service // info level  // address of structure // size of structure  // if buffer too small
  98.         {
  99.                 printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
  100.                 exit(0);
  101.         }


  102.         //这段代码没看懂,功能不知道?????????????????????????????????????
  103.         dwStartTickCount = GetTickCount();
  104.         dwOldCheckPoint = s_Status.dwCheckPoint;
  105.         // 查询状态,确定 PENDING 状态结束
  106.         while (s_Status.dwCurrentState == SERVICE_START_PENDING)
  107.         {
  108.                 // 等待一段时间
  109.                 dwWaitTime = s_Status.dwWaitHint / 10;
  110.                 if( dwWaitTime < 1000 )
  111.                         dwWaitTime = 1000;
  112.                 else if ( dwWaitTime > 10000 )
  113.                         dwWaitTime = 10000;
  114.                 Sleep( dwWaitTime );
  115.                 // 再次查询
  116.                 if (!QueryServiceStatusEx(
  117.                         h_Service,             // handle to service
  118.                         SC_STATUS_PROCESS_INFO, // info level
  119.                         (LPBYTE)&s_Status,              // address of structure
  120.                         sizeof(SERVICE_STATUS_PROCESS), // size of structure
  121.                         &dwBytesNeeded ) )              // if buffer too small
  122.                         break;
  123.                 if ( s_Status.dwCheckPoint > dwOldCheckPoint )
  124.                 {
  125.                         // 进程创建中
  126.                         dwStartTickCount = GetTickCount();
  127.                         dwOldCheckPoint = s_Status.dwCheckPoint;
  128.                 }
  129.                 else
  130.                 {
  131.                         if(GetTickCount()-dwStartTickCount > s_Status.dwWaitHint)
  132.                         {
  133.                                 // WaitHint 时间到
  134.                                 break;
  135.                         }
  136.                 }
  137.         }

  138.         if (s_Status.dwCurrentState == SERVICE_RUNNING)
  139.                 printf("StartService SUCCESS.\n");
  140.         else
  141.         {
  142.                 printf("\nService not started. \n");
  143.                 printf("  Current State: %d\n", s_Status.dwCurrentState);
  144.                 printf("  Exit Code: %d\n", s_Status.dwWin32ExitCode);
  145.                 printf("  Service Specific Exit Code: %d\n",
  146.                         s_Status.dwServiceSpecificExitCode);
  147.                 printf("  Check Point: %d\n", s_Status.dwCheckPoint);
  148.                 printf("  Wait Hint: %d\n", s_Status.dwWaitHint);
  149.                 printf("error : %d\n",GetLastError());
  150.         }


  151.         CloseServiceHandle(h_Service);
  152.         CloseServiceHandle(h_SCManager);
  153.         exit(0);
  154. }

复制代码





上一篇:这个图中的user module发出的两个箭头send message和post message和图中其它部分
下一篇:关于双面打印的问题
88_avatar_middle
online_vip 发表于 2016-12-21 20:01:41 | 显示全部楼层
废话不要那么多,自己没用对,自己度娘 一堆的代码
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号tongdun|网站地图wx_jqr

GMT+8, 2019-8-25 00:54

Powered by Discuz! X3.4

© 2009-2019 cctry.com

快速回复 返回顶部 返回列表