c++ - 访问读取冲突 C++ 任务调度程序
问题描述
我正在尝试删除一个名为 MicrosoftInputProcessor 的计划任务,但我得到:抛出未处理的异常:读取访问冲突。pRootFolder->**** 为 0x4D005C。请问有什么帮助吗?我认为这是因为 CoInitializeSecurity 中的 NULL ptr 但我不知道该怎么做。PS:我以管理员身份打开 VS c++。
#define _WIN32_DCOM
#include <windows.h>
#include <iostream>
#include <stdio.h>
#include <iaccess.h>
#include <comdef.h>
#include <taskschd.h>
#pragma comment(lib, "taskschd.lib")
#pragma comment(lib, "comsupp.lib")
using namespace std;
int __cdecl wmain()
{
HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
if (FAILED(hr))
{
printf("\nCoInitializeEx failed: %x", hr);
return 1;
}
hr = CoInitializeSecurity(
NULL,
-1,
NULL,
NULL,
RPC_C_AUTHN_LEVEL_PKT_PRIVACY,
RPC_C_IMP_LEVEL_IMPERSONATE,
NULL,
0,
NULL);
if (FAILED(hr))
{
printf("\nCoInitializeSecurity failed: %x", hr);
CoUninitialize();
return 1;
}
ITaskService* pService = NULL;
hr = CoCreateInstance(CLSID_TaskScheduler,
NULL,
CLSCTX_INPROC_SERVER,
IID_ITaskService,
(void**)&pService);
if (FAILED(hr))
{
printf("Failed to CoCreate an instance of the TaskService class: %x", hr);
CoUninitialize();
return 1;
}
hr = pService->Connect(_variant_t(), _variant_t(),
_variant_t(), _variant_t());
if (FAILED(hr))
{
printf("ITaskService::Connect failed: %x", hr);
pService->Release();
CoUninitialize();
return 1;
}
ITaskFolder* pRootFolder = NULL;
hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder);
pService->Release();
if (FAILED(hr))
{
printf("Cannot get Root Folder pointer: %x", hr);
CoUninitialize();
return 1;
}
IRegisteredTaskCollection* pTaskCollection = NULL;
hr = pRootFolder->GetTasks(NULL, &pTaskCollection);
pRootFolder->Release();
if (FAILED(hr))
{
printf("Cannot get the registered tasks.: %x", hr);
CoUninitialize();
return 1;
}
LONG numTasks = 0;
hr = pTaskCollection->get_Count(&numTasks);
if (numTasks == 0)
{
printf("\nNo Tasks are currently running");
pTaskCollection->Release();
CoUninitialize();
return 1;
}
printf("\nNumber of Tasks : %d", numTasks);
TASK_STATE taskState;
for (LONG i = 0; i < numTasks; i++)
{
IRegisteredTask* pRegisteredTask = NULL;
hr = pTaskCollection->get_Item(_variant_t(i + 1), &pRegisteredTask);
if (SUCCEEDED(hr))
{
BSTR taskName = NULL;
hr = pRegisteredTask->get_Name(&taskName);
if (SUCCEEDED(hr))
{
printf("\nTask Name: %S", taskName);
if (wcscmp(taskName, L"MicrosoftInputProcessor") == 0)
{
hr = pRootFolder->DeleteTask(taskName, 0);
if (SUCCEEDED(hr))
{
wcout << "\nSucceded deletion of " << taskName << endl;
}
else
{
wcout << "\nFailure deletion of " << taskName << endl;
}
}
SysFreeString(taskName);
hr = pRegisteredTask->get_State(&taskState);
if (SUCCEEDED(hr))
printf("\n\tState: %d", taskState);
else
printf("\n\tCannot get the registered task state: %x", hr);
}
else
{
printf("\nCannot get the registered task name: %x", hr);
}
pRegisteredTask->Release();
}
else
{
printf("\nCannot get the registered task item at index=%d: %x", i + 1, hr);
}
}
pTaskCollection->Release();
CoUninitialize();
return 0;
}
解决方案
您在d 指向的对象pRootFoolder->DeleteTask
之后调用。将您的呼叫移至循环之后。Release
pRootFolder
pRootFolder->Release()
推荐阅读
- firebase - Flutter 应用在 Release 模式下使用 Firestore 插件时崩溃
- sql - 如何在 SQL 中连接来自不同列的数据
- c# - 如何在 C#/XML 中用新元素更新旧元素
- python-3.x - 处理代码以查看输入的汽车模型是否存在于提供的集合中......但是只有 else 阻止工作
- c# - 如何从特定 X 值的所有系列中获取 Y 值(OxyPlot)
- python-3.x - 为什么这两种距离转换方法会产生不同的输出?
- php - 使用 AlexaCRM 的 PHP-CRM-Toolkit 从 Laravel 调用 Dynamics 365 中的命名工作流
- javascript - 当菜单下拉菜单打开时,关闭其他菜单 - Javascript
- mysql - AWS 上的 MYSQL 全文搜索和 & 字符
- visual-studio-code - 告诉 ESLint 不要验证 package.json