我在实际情况中发现使用关闭Windows服务的方式重启IIS是有一定概率失败的,很可能是由超时时间导致的。使用COM组件的方式重启IIS就没有这个问题,iisreset.exe使用的就是这个COM接口。
#include <windows.h>
#include <iisrsta.h>
const IID IID_IIisServiceControl =
{ 0x0E8FB8620, 0x588F, 0x11D2,
{ 0x9D, 0x61, 0x00, 0xC0, 0x4F, 0x79, 0xC5, 0xFE } };
const GUID CLSID_IisServiceControl =
{ 0x0E8FB8621, 0x588F, 0x11D2,
{ 0x9D, 0x61, 0x00, 0xC0, 0x4F, 0x79, 0xC5, 0xFE } };
int main(int argc, char* argv[])
{
HRESULT result;
int rc = -1;
IIisServiceControl* IisSrvCtrl = nullptr;
result = CoInitializeEx(0, 0);
if (result != S_OK)
return 1;
do
{
result = CoCreateInstance(CLSID_IisServiceControl,
nullptr,
CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER | CLSCTX_INPROC_SERVER,
IID_IIisServiceControl,
(LPVOID*)&IisSrvCtrl
);
if (result != S_OK)
{
rc = 2;
break;
}
//如果IIS服务本身就是关闭状态,调用Stop函数返回的也是S_OK
result = IisSrvCtrl->Stop(60 * 1000, TRUE);
if (result != S_OK)
{
MessageBoxA(NULL, "关闭服务失败", "", 0);
rc = 3;
break;
}
//
MessageBoxA(NULL, "成功关闭IIS服务", "", 0);
result = IisSrvCtrl->Start(60 * 1000);
if (S_OK != result)
{
MessageBoxA(NULL, "启动服务失败", "", 0);
rc = 4;
break;
}
rc = 0;
} while (0);
CoUninitialize();
return rc;
}
发表回复