不知道如何正确使用IShellWindows::Item
don't know how to use IShellWindows::Item correctly
我在XP系统上使用VC6。
以下是我的代码。它在我的计算机上运行得很好,但在其他计算机上,pisw->Item(v,&pidisp)似乎不等于S_OK。现在我正试图弄清楚这里出了什么问题
IShellWindows *pisw;
if (SUCCEEDED(CoCreateInstance(CLSID_ShellWindows, NULL, CLSCTX_ALL,
IID_IShellWindows, (void**)&pisw))) {
VARIANT v;
V_VT(&v) = VT_I4;
IDispatch *pidisp;
found = FALSE;
for (V_I4(&v) = 0; !found && pisw->Item(v, &pidisp) == S_OK; V_I4(&v)++) {
IWebBrowserApp *piwba;
if (SUCCEEDED(pidisp->QueryInterface(IID_IWebBrowserApp, (void**)&piwba))) {
// blablabla....do something..
}
所以我把一些代码改成了
...
IDispatch *pidisp;
hr = pisw->Item(v, &pidisp);
if (SUCCEEDED(hr))
{
for (V_I4(&v) = 0; !found ; V_I4(&v)++) {
IWebBrowserApp *piwba;
if (SUCCEEDED(pidisp->QueryInterface(IID_IWebBrowserApp, (void**)&piwba))) {
// blablabla....do something..
}
}
则hr的返回值变为1。当运行到"pidisp->.."步骤时,它会出现访问冲突错误。有人能帮我吗?
原始代码错误地测试了pisw->Item(v, &pidisp)
的结果。奇怪,因为它稍后确实使用了正确的检查。
问题是除了S_OK
之外还有许多成功返回值。您的修复是正确的,您应该使用SUCCEEDED(hr)
,但您在SUCCEEDED(hr)
测试中错误地移动了循环。您应该针对V_I4(&v)
的每个值检查SUCCEEDED(hr)
。
您的S_FALSE
结果是因为您现在在循环之前调用hr = pisw->Item(v, &pidisp);
,这意味着v
未初始化(垃圾)。暂时假设其垃圾值为728365。S_FALSE
表示:调用成功,但窗口数少于728365个。
MSDN IShellWindows::Item
:
返回值类型:HRESULT S_FALSE(1)指定的窗口不是建立
找不到您要查找的项目,而且您显然没有得到有效的pidisp
。尝试使用它会导致访问违规。
您需要正确处理"itemnotfound"的情况,并检查您的v
参数。
相关文章:
- C++:如何正确设置 "Item" 类
- 数组 X[n] 仅存储名称.编写算法以在数组中插入或删除 ITEM
- 如何在数据库程序中添加"reduce the quantity of an item"功能?
- 为什么不能从 QVector 将 Item 添加到 QGraphicsScene <QGraphicsItem>中?
- 防止 QGraphicsItem::itemAt() 在"Background Item"上
- 按列进行排序后,如何从qtablewidget :: item(qt bug?)中获取正确的行
- std :: vector :: erase(item)需要为项目定义的分配操作员
- xrces item returning NULL
- Qt - QStringList to QListWidget*item
- 创建"Item"定义
- 未在qgraphicsItem上调用ItemChange.Item会解覆盖标志
- 致命错误 C1083:无法打开包含文件:"Item.h":没有此类文件或目录
- 为什么编译器说我不能将项插入到 std::set 中<Item>?
- QInputDialog.getItem() get item index
- QT QTableWidget::item() 返回 nullptr,即使分配给它的 widget
- 为什么我会收到错误"Array type Item[1000] is not assignable"?
- 在视觉C++中创建"Add New Item Wizard"
- 访问地图的一个"item"
- C++静态结构init-item没有命名类型
- 不知道如何正确使用IShellWindows::Item