MFC调用DLL函数,内存出错

愤怒的红萝卜 2016-01-10 03:00:04
自己创建的一个DLL内的一个WMI函数

string CMyWMI::QuerySystemInfo()
{
HRESULT hres; //定义COM调用的返回
IEnumWbemClassObject* pEnumerator = NULL;
bool bRet = false;
string result;
try{
hres = pSvc_->ExecQuery(
bstr_t("WQL"),
bstr_t("SELECT * FROM Win32_OperatingSystem"),
WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,
NULL,
&pEnumerator);

if (FAILED(hres))
{
throw exception("ExecQuery() error.");
}

while (pEnumerator)
{
IWbemClassObject *pclsObj;
ULONG uReturn = 0;

HRESULT hr = pEnumerator->Next(WBEM_INFINITE, 1,
&pclsObj, &uReturn);
if(0 == uReturn)
{
break;
}

//GetInfo(L"BootDevice",pclsObj);
result=GetInfo(L"Caption",pclsObj);
//GetInfo(L"Manufacturer",pclsObj);
//GetInfo(L"CSName",pclsObj);
//GetInfo(L"WindowsDirectory",pclsObj);
//GetInfo(L"SystemDirectory",pclsObj);
//GetInfo(L"TotalVisibleMemorySize",pclsObj);
//GetInfo(L"FreePhysicalMemory",pclsObj);

pclsObj->Release();
}


}catch(exception& e)
{
cout << e.what() << endl;
if(pEnumerator != NULL)
{
pEnumerator->Release();
pEnumerator = NULL;
}
//return NULL;
}


if(pEnumerator != NULL)
{
pEnumerator->Release();
pEnumerator = NULL;
}

//bRet = true;
return result;
}


MFC框架内的反应函数
void Infoshow::OnBnClickedGetSysinfo()
{
//string SysInfo;
// TODO: 在此添加控件通知处理程序代码

CMyWMI myWMI;
//myWMI.InitWMI();
// SysInfo=myWMI.QuerySystemInfo();
// SysInfo="111";
m_Infotop="系统版本信息为:";
m_Infoshow=myWMI.QuerySystemInfo().c_str();
UpdateData(false);// TODO: 在此添加控件通知处理程序代码
}
出错截图:
...全文
197 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
_Tiny 2016-01-19
  • 打赏
  • 举报
回复
一般都是指针没有初始化,逻辑问题,debug模式下过了,Release下出现这问题更头疼。已经知道是dll哪个函数出问题了,debug跟进去看看是哪个指针,然后看看初始化,内存释放有木有问题咯。
搬砖的奶霸 2016-01-19
  • 打赏
  • 举报
回复
指针作为参数传入DLL
zgl7903 2016-01-11
  • 打赏
  • 举报
回复
if(pSvc_ == NULL) { //初始化 …… }
孤客天涯 2016-01-10
  • 打赏
  • 举报
回复
跟踪进dll呀,看看那指针为何为空?
愤怒的红萝卜 2016-01-10
  • 打赏
  • 举报
回复
IEnumWbemClassObject* pEnumerator = NULL;
愤怒的红萝卜 2016-01-10
  • 打赏
  • 举报
回复
谁给看一下 啊,搞不了了
愤怒的红萝卜 2016-01-10
  • 打赏
  • 举报
回复
string CMyWMI::QueryCPUInfo()
{
	string result;
	HRESULT hres; //定义COM调用的返回  
	IEnumWbemClassObject* pEnumerator = NULL;  
	//bool bRet = false;

	try{
		hres = pSvc_->ExecQuery(  
			bstr_t("WQL"),     
			bstr_t("SELECT * FROM Win32_Processor"),  
			WBEM_FLAG_FORWARD_ONLY | WBEM_FLAG_RETURN_IMMEDIATELY,   
			NULL,  
			&pEnumerator);  
            
}
提示就是这个指针的问题,但程序未封装成DLL时,是可以运行的,能正确提取,后来创建成W32 DLL的空项目,封装成dll后,通过MFC调用这个dll就出问题了,我感觉可能是两者的兼容问题
zgl7903 2016-01-10
  • 打赏
  • 举报
回复
逻辑不严谨吧? 如果 pSvc_ 是空指针呢 DLL 也可以调试的
愤怒的红萝卜 2016-01-10
  • 打赏
  • 举报
回复
来位大神棒给看看

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧