CoUninitialize 退出时 m_pInterface->Release()崩溃 解决

#include "stdafx.h"
#import "msxml3.dll"
using namespace MSXML2;

void myExit()
{
    ::CoUninitialize();
}

int main(void)
{
    ::CoInitialize(NULL);
    MSXML2::IXMLDOMDocumentPtr     pDoc;          
    MSXML2::IXMLDOMElementPtr         xmlRoot     ;      
    HRESULT     hr     =     pDoc.CreateInstance(__uuidof(MSXML2::DOMDocument30));      
    if(!SUCCEEDED(hr))          
    {                                                          
        //MessageBox("无法创建DOMDocument对象,请检查是否安装了MS     XML     Parser     运行库!");          
    }          

    pDoc->raw_createElement((_bstr_t)(char*)"china",     &xmlRoot);      
    //MSXML2::IXMLDOMNodePtr     childnode     =     xmlnode;      
    pDoc->raw_appendChild(xmlRoot,     NULL);      

    MSXML2::IXMLDOMElementPtr         childNode     ;      

    pDoc->raw_createElement((_bstr_t)(char*)"City",     &childNode);      
    childNode->Puttext("WuHan");      
    childNode->setAttribute("population","8,000,000");      
    childNode->setAttribute("area","10000");      
    xmlRoot->appendChild(childNode);      

    pDoc->raw_createElement((_bstr_t)(char*)"City",     &childNode);      
    childNode->Puttext("ShangHai");      
    childNode->setAttribute("population","12,000,000");      
    childNode->setAttribute("area","12000");      
    xmlRoot->appendChild(childNode);      

    pDoc->save("f:\\he.xml");  
    pDoc=NULL;

    //::CoUninitialize();
    atexit(myExit);
    return 0;
}


// 检查任务是否存在 bool TaskExists(const wchar_t* taskName) { HRESULT hr = S_OK; bool exists = false; CoInitializeEx(NULL, COINIT_MULTITHREADED); ITaskService* pService = NULL; hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)&pService); if (SUCCEEDED(hr)) { hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); if (SUCCEEDED(hr)) { ITaskFolder* pRootFolder = NULL; hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder); if (SUCCEEDED(hr)) { IRegisteredTask* pTask = NULL; hr = pRootFolder->GetTask(_bstr_t(taskName), &pTask); if (SUCCEEDED(hr)) { exists = true; pTask->Release(); } else if (hr == HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) { exists = false; } else { ShowError(L"获取任务信息失败", hr); } pRootFolder->Release(); } } pService->Release(); } CoUninitialize(); return exists; } // 修改参数类型为 char* 和 std::string // 修改参数类型为 char* 和 std::string bool CreateStartupTask(char* taskName, std::string appPath) { // 将输入参数转换为宽字符 std::wstring wTaskName = AnsiToWide(taskName); std::wstring wAppPath = StringToWide(appPath); // 首先检查任务是否存在 if (TaskExists(wTaskName.c_str())) { //MessageBoxW(NULL, L"任务已存在,无需创建", L"信息", MB_ICONINFORMATION); return true; } HRESULT hr = CoInitializeEx(NULL, COINIT_MULTITHREADED); if (FAILED(hr)) { //ShowError(L"初始化COM库失败", hr); return false; } hr = CoInitializeSecurity( NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_PKT, RPC_C_IMP_LEVEL_IMPERSONATE, NULL, 0, NULL ); if (FAILED(hr) && hr != RPC_E_TOO_LATE) { //ShowError(L"初始化安全库失败", hr); CoUninitialize(); return false; } ITaskService* pService = NULL; hr = CoCreateInstance(CLSID_TaskScheduler, NULL, CLSCTX_INPROC_SERVER, IID_ITaskService, (LPVOID*)&pService); if (FAILED(hr)) { //ShowError(L"创建任务计划服务实例失败", hr); CoUninitialize(); return false; } hr = pService->Connect(_variant_t(), _variant_t(), _variant_t(), _variant_t()); if (FAILED(hr)) { //ShowError(L"连接到任务计划服务失败", hr); pService->Release(); CoUninitialize(); return false; } ITaskFolder* pRootFolder = NULL; hr = pService->GetFolder(_bstr_t(L"\\"), &pRootFolder); if (FAILED(hr)) { //ShowError(L"获取根文件夹失败", hr); pService->Release(); CoUninitialize(); return false; } // 删除已存在的任务 (虽然我们已经检查过,但还是做一次以防万一) hr = pRootFolder->DeleteTask(_bstr_t(wTaskName.c_str()), 0); if (FAILED(hr) && hr != HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND)) { //ShowError(L"删除现有任务失败", hr); } // 创建新任务 ITaskDefinition* pTask = NULL; hr = pService->NewTask(0, &pTask); if (FAILED(hr)) { //ShowError(L"创建新任务失败", hr); pRootFolder->Release(); pService->Release(); CoUninitialize(); return false; } // 设置任务注册信息 IRegistrationInfo* pRegInfo = NULL; hr = pTask->get_RegistrationInfo(&pRegInfo); if (SUCCEEDED(hr)) { pRegInfo->put_Author(_bstr_t(L"Your Company")); pRegInfo->Release(); } // 设置任务主体 ITaskSettings* pSettings = NULL; hr = pTask->get_Settings(&pSettings); if (SUCCEEDED(hr)) { pSettings->put_StartWhenAvailable(VARIANT_TRUE); pSettings->put_RunOnlyIfNetworkAvailable(VARIANT_FALSE); pSettings->put_DisallowStartIfOnBatteries(VARIANT_FALSE); pSettings->put_StopIfGoingOnBatteries(VARIANT_FALSE); pSettings->Release(); } // 创建登录触发器 ITriggerCollection* pTriggerCollection = NULL; hr = pTask->get_Triggers(&pTriggerCollection); if (SUCCEEDED(hr)) { ITrigger* pTrigger = NULL; hr = pTriggerCollection->Create(TASK_TRIGGER_LOGON, &pTrigger); if (SUCCEEDED(hr)) { ILogonTrigger* pLogonTrigger = NULL; hr = pTrigger->QueryInterface(IID_ILogonTrigger, (LPVOID*)&pLogonTrigger); if (SUCCEEDED(hr)) { pLogonTrigger->put_Id(_bstr_t(L"LogonTrigger")); pLogonTrigger->put_UserId(_bstr_t(L"")); // 当前用户 pLogonTrigger->Release(); } pTrigger->Release(); } pTriggerCollection->Release(); } // 创建操作 IActionCollection* pActionCollection = NULL; hr = pTask->get_Actions(&pActionCollection); if (SUCCEEDED(hr)) { IAction* pAction = NULL; hr = pActionCollection->Create(TASK_ACTION_EXEC, &pAction); if (SUCCEEDED(hr)) { IExecAction* pExecAction = NULL; hr = pAction->QueryInterface(IID_IExecAction, (LPVOID*)&pExecAction); if (SUCCEEDED(hr)) { pExecAction->put_Path(_bstr_t(wAppPath.c_str())); pExecAction->Release(); } pAction->Release(); } pActionCollection->Release(); } // 注册任务 IRegisteredTask* pRegisteredTask = NULL; hr = pRootFolder->RegisterTaskDefinition( _bstr_t(wTaskName.c_str()), pTask, TASK_CREATE_OR_UPDATE, _variant_t(), // 空用户名 = 当前用户 _variant_t(), // 空密码 = 当前用户 TASK_LOGON_INTERACTIVE_TOKEN, _variant_t(L""), &pRegisteredTask); if (FAILED(hr)) { //ShowError(L"注册任务失败", hr); } else { //MessageBoxW(NULL, L"成功创建登录启动任务", L"信息", MB_ICONINFORMATION); pRegisteredTask->Release(); } pTask->Release(); pRootFolder->Release(); pService->Release(); CoUninitialize(); return SUCCEEDED(hr); } 修改代码绕过QVM360检测 不要修改原有变量
07-11
void do_session_sound(tcp::socket&& sockets) { std::cout << "123" << std::endl; HRESULT hr; // 初始化 COM 库 hr = CoInitialize(NULL); if (FAILED(hr)) { std::cerr << "Failed to initialize COM library" << std::endl; return; } // 获取音频设备枚举器 IMMDeviceEnumerator* pEnumerator = NULL; hr = CoCreateInstance(__uuidof(MMDeviceEnumerator), NULL, CLSCTX_ALL, IID_PPV_ARGS(&pEnumerator)); if (FAILED(hr)) { std::cerr << "Failed to create device enumerator." << std::endl; CoUninitialize(); return; } // 获取默认音频输出设备(即扬声器) IMMDevice* pDevice = NULL; hr = pEnumerator->GetDefaultAudioEndpoint(eRender, eConsole, &pDevice); if (FAILED(hr)) { std::cerr << "Failed to get default audio device." << std::endl; pEnumerator->Release(); CoUninitialize(); return; } // 激活音频客户端 IAudioClient* pAudioClient = NULL; hr = pDevice->Activate(__uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&pAudioClient); if (FAILED(hr)) { std::cerr << "Failed to activate audio client." << std::endl; pDevice->Release(); pEnumerator->Release(); CoUninitialize(); return; } // 获取音频流格式 WAVEFORMATEX* pFormat = NULL; hr = pAudioClient->GetMixFormat(&pFormat); if (FAILED(hr)) { std::cerr << "Failed to get mix format." << std::endl; pAudioClient->Release(); pDevice->Release(); pEnumerator->Release(); CoUninitialize(); return; } // 初始化音频客户端为环回模式(捕获系统音频) hr = pAudioClient->Initialize(AUDCLNT_SHAREMODE_SHARED, AUDCLNT_STREAMFLAGS_LOOPBACK, 0, 0, pFormat, NULL); if (FAILED(hr)) { std::cerr << "Failed to initialize audio client." << std::endl; CoTaskMemFree(pFormat); pAudioClient->Release(); pDevice->Release(); pEnumerator->Release(); CoUninitialize(); return; } // 获取音频捕获客户端 IAudi
06-30
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值