ฉันมีแอปพลิเคชันใน C++
ซึ่งพยายามเรียกใช้ (ในขณะนั้น คิดว่าไม่มีกระบวนการอื่นที่เกี่ยวข้องกำลังทำงานอยู่) เพื่อติดตั้งบริการสองสามอย่าง
ขั้นตอนการทำงานคือ หากมีบริการอยู่ ระบบจะถอนการติดตั้งบริการดังกล่าว มิฉะนั้นจะถอนการติดตั้งแล้วติดตั้งใหม่
ฉันได้ปฏิบัติตามบทช่วยสอนบางอย่างเช่น: การติดตั้งบริการ< /ก>
ขออภัย ดูเหมือนมีบางอย่างผิดปกติกับการติดตั้งหรือการถอนการติดตั้ง
เมื่อสมมติว่าไม่ได้ติดตั้งบริการ เมื่อฉันดำเนินการติดตั้งบริการ บริการเหล่านั้นจะได้รับการติดตั้ง และจากนั้นฉันก็พยายามเปลี่ยนการกำหนดค่าเป็นดีเลย์ - สตาร์ทอัตโนมัติ
ในขั้นตอนนี้ แม้ว่าจะมีการติดตั้งบริการแล้ว แต่ฉันไม่สามารถเริ่มบริการได้ เนื่องจากฉันได้รับข้อผิดพลาดแจ้งว่าไม่พบบริการ
เมื่อฉันลองถอนการติดตั้งบริการ การถอนการติดตั้งล้มเหลว โดยให้ข้อผิดพลาด 1,060 โดยแจ้งว่าบริการถูกทำเครื่องหมายเพื่อการลบ
SC_HANDLE schSCManager;
SC_HANDLE schService;
schSCManager = OpenSCManager(
NULL, // local computer
NULL, // ServicesActive database
SC_MANAGER_ALL_ACCESS); // full access rights
if (schSCManager == nullptr)
{
continue;
}
if (bInstall)
{
schService = CreateService(
schSCManager, // SCM database
szServiceName, // name of service
szDisplayName, // service name to display
SERVICE_ALL_ACCESS, // desired access
SERVICE_WIN32_OWN_PROCESS, // service type
SERVICE_DEMAND_START, // start type
SERVICE_ERROR_NORMAL, // error control type
szDirectory, // path to service's binary
NULL, // no load ordering group
NULL, // no tag identifier
NULL, // no dependencies
NULL, // LocalSystem account
NULL); // no password
if (schService == NULL)
{
TraceAdvice(L"CreateService failed (%d)\n", GetLastError());
CloseServiceHandle(schSCManager);
continue;
}
else
{
if (!ChangeServiceConfig(
schService, // handle of service
SERVICE_NO_CHANGE, // service type: no change
SERVICE_CONFIG_DELAYED_AUTO_START_INFO, // service start type
SERVICE_NO_CHANGE, // error control: no change
NULL, // binary path: no change
NULL, // load order group: no change
NULL, // tag ID: no change
NULL, // dependencies: no change
NULL, // account name: no change
NULL, // password: no change
NULL)) // display name: no change
{
TraceAdvice(L"ChangeServiceConfig failed (%d)\n", GetLastError());
}
TraceAdvice(L"Service installed successfully\n");
}
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
/*TraceFatal(_T("Now installing : %s"), szServiceName);
_stprintf_s(szTmp, _T("SC create %s binpath= \"%s%s.exe\" displayName= \"%s\" start= delayed-auto"), szServiceName, szDirectory, szServiceName, szDisplayName);
TraceFatal(_T("Command is : %s"), szTmp);*/
}
else
{
_wsystem(_T("taskkill /F /IM mmc.exe")); // Need to kill any instance of MMC running
_wsystem(_T("taskkill /F /IM procexp.exe"));
schService = OpenService(
schSCManager, // SCM database
szServiceName, // name of service
DELETE); // need delete access
if (schService == NULL)
{
TraceAdvice(L"OpenService failed (%d)\n", GetLastError());
CloseServiceHandle(schSCManager);
continue;
}
DWORD dwBytesNeeded;
SERVICE_STATUS_PROCESS ssp;
if (!QueryServiceStatusEx(
schService,
SC_STATUS_PROCESS_INFO,
(LPBYTE)&ssp,
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded))
{
printf("QueryServiceStatusEx failed (%d)\n", GetLastError());
}
if (ssp.dwCurrentState == SERVICE_RUNNING)
{
_stprintf_s(szTmp, _T("taskkill /F /IM %s.exe"), szServiceName);
_wsystem(szTmp);
}
// Delete the service.
if (!DeleteService(schService))
{
TraceAdvice(L"DeleteService failed (%d)\n", GetLastError());
}
else TraceAdvice(L"Service deleted successfully\n");
CloseServiceHandle(schService);
CloseServiceHandle(schSCManager);
}
}
ฉันมั่นใจในทุกประเด็น กล่าวคือ
- ตัวจัดการงานถูกปิด
- คอนโซลบริการถูกปิด
- ปิดอินสแตนซ์ทั้งหมดของ MMC แล้ว
- บริการถูกหยุด
- บริการไม่ได้เปิดในตัวดีบักเกอร์ใน Visual Studio...
แต่มันไม่เกิดประโยชน์ บริการไม่ได้รับการถอนการติดตั้งจนกว่าฉันจะรีบูทระบบ (การลบรีจิสทรีที่เชื่อมโยงกับบริการก็ไม่ทำงานเช่นกัน)
ฉันได้ตรวจสอบพารามิเตอร์ที่ฉันส่งต่อไปยังฟังก์ชันเหล่านี้แล้ว และดูเหมือนว่าจะถูกต้อง
ฉันควรตรวจสอบอะไรอีกบ้างเพื่อให้แน่ใจว่าการติดตั้งถูกต้อง หรือการถอนการติดตั้งสำเร็จ
szDirectory
มีเส้นทาง เต็ม ไปยังบริการที่ปฏิบัติการได้ และไม่ใช่ (ตามชื่อตัวแปรที่แนะนำ) เป็นเพียงเส้นทางไปยังไดเรกทอรีที่บริการปฏิบัติการอยู่ เมื่อถอนการติดตั้ง ผลลัพธ์ของการเรียก QueryServiceStatusEx คืออะไร - person Harry Johnston   schedule 12.10.2016