解决方案 »
- 自己写了个下载程序,如何在左击链接后自动运行我的程序呢
- 关于ado智能指针的问题
- 关于重载 CDestDoc::OnFileSave() 和CDestDoc::OnFileSaveAs() 的简单问题???
- 报错为CInternetSession' : undeclared identifier是为何?
- 请问:VC++中如何处理Access中长文本?
- 如何在类中创建一个线程?
- 我的Dll(动态链接库)学习笔记,欢迎大家指正
- 鼠标左键按下拖动是对应的windows消息是哪个?(像WM_LBUTTONDOWE)
- VC++中 Image img(wPicName,TRUE);时出现
- 如何让我的问题在上面多呆几天,我每次提的问题我还没有得到回答呢就不见了,惨惨惨怎么办?
- 关于MFC中坐标变换的问题?
- VS2010 的BUG?
执行CoUninitialize后,可能操作就无法结束,就崩溃了。所以不管什么代码,都用{}括起来
int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); CComPtr<IShellDispatch> spShellDispatch;
HRESULT hr = spShellDispatch.CoCreateInstance(CLSID_Shell);
if ( SUCCEEDED(hr) )
{
spShellDispatch->SetTime();
} CoUninitialize(); return 0;
}
那为什么这样就不会挂掉?int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL); CComPtr<IShellDispatch> spShellDispatch;
HRESULT hr = spShellDispatch.CoCreateInstance(CLSID_Shell);
if ( SUCCEEDED(hr) )
{
spShellDispatch->SetTime();
} CoUninitialize(); return 0;
}
我把现象在说一遍吧:这两个玩意都能他们弹出
时间框,但是没有花括号的代码在智能指针析构的时候就挂了
~CComPtrBase() throw()
{
if (p)
p->Release(); // 运行这句的时候挂了!
}
试了你的方法,我在CoUninitialize之前Sleep(5000),还是不行。
我把现象在说一遍吧:这两个玩意都能他们弹出
时间框,但是没有花括号的代码在智能指针析构的时候就挂了
~CComPtrBase() throw()
{
if (p)
p->Release(); // 运行这句的时候挂了!
}
试了你的方法,我在CoUninitialize之前Sleep(5000),还是不行。
是这个意思啊,那就是析构的问题啊,你这个IWindowsShell明显是在CoUninitialize之后析构了,因此崩溃了,至于IShellDispatch为什么没崩溃,很可能他是CoUninitialize之前做了什么特殊处理(也有可能它本身内部做了什么处理),因此没有崩溃,验证方法就是在p->Release();这里下个断点就能看见。
是的,IShellDispatch在p->Release();没有崩溃,而我的代码在p->Release();就崩溃了。
如果是IShellDispatch做了特殊处理,那做了什么特殊处理啊?
那如果我们不知道做了什么特殊处理,当使用CComPtr的时候就只能多多使用花括号了啊?
是的,IShellDispatch在p->Release();没有崩溃,而我的代码在p->Release();就崩溃了。
如果是IShellDispatch做了特殊处理,那做了什么特殊处理啊?
那如果我们不知道做了什么特殊处理,当使用CComPtr的时候就只能多多使用花括号了啊?
单独写一个函数,这样局部变量在函数结束时就析构了