You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

微软官方WMI示例触发Access violation问题求助

解决WMI调用Win32_Process.Create时Put方法触发的C5访问违例

核心问题分析

触发访问违例的根本原因是BSTR指针悬空:
原代码中varCommand.bstrVal = _bstr_t(L"notepad.exe");创建了临时_bstr_t对象,赋值完成后临时对象立即销毁,其内部管理的BSTR被自动释放,导致varCommand.bstrVal指向已释放的内存。当IWbemClassObject::Put尝试读取这个无效指针时,就触发了C5访问违例。

另外,代码未调用VariantInit初始化VARIANT,可能导致内存状态未定义,进一步加剧问题。

修复方案

以下两种方案均可解决问题:

方案1:直接使用SysAllocString分配BSTR

// Create the values for the in parameters
VARIANT varCommand;
VariantInit(&varCommand); // 必须初始化VARIANT
varCommand.vt = VT_BSTR;
varCommand.bstrVal = SysAllocString(L"notepad.exe"); // 直接分配独立BSTR

// Store the value for the in parameters
hres = pClassInstance->Put(L"CommandLine", 0, &varCommand, 0);
if (SUCCEEDED(hres)) {
    wprintf(L"The command is: %s\n", varCommand.bstrVal);
}

// 使用完毕后清理资源
VariantClear(&varCommand);

方案2:正确使用_bstr_t管理BSTR生命周期

// Create the values for the in parameters
_bstr_t cmdStr(L"notepad.exe"); // 声明为局部变量,延长生命周期
VARIANT varCommand;
VariantInit(&varCommand);

// 方式1:直接赋值_bstr_t给VARIANT(自动处理类型转换和内存)
varCommand = cmdStr;

// 方式2:手动复制BSTR(避免依赖自动转换)
// varCommand.vt = VT_BSTR;
// varCommand.bstrVal = cmdStr.copy();

// Store the value for the in parameters
hres = pClassInstance->Put(L"CommandLine", 0, &varCommand, 0);
if (SUCCEEDED(hres)) {
    wprintf(L"The command is: %s\n", V_BSTR(&varCommand));
}

// 使用完毕后清理资源
VariantClear(&varCommand);

关键注意事项

  • 所有VARIANT变量必须用VariantInit初始化,使用完毕后用VariantClear清理,避免内存泄漏或未定义行为。
  • 避免将临时_bstr_t对象的bstrVal直接赋值给变量,临时对象销毁会导致BSTR被释放。
  • 若使用_bstr_t,确保其生命周期覆盖到Put调用完成之后,或通过copy()方法复制独立的BSTR。

内容的提问来源于stack exchange,提问作者Pulpo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 01:11:32