gpt4 book ai didi

java - 获取打开的窗口和选定的项目时出现错误 com4j.ComException : 80004005 .\invoke.cpp:51

转载 作者:行者123 更新时间:2023-11-30 08:14:31 24 4
gpt4 key购买 nike

我需要获取 Windows 资源管理器中所有选定的文件和文件夹。我正在使用 com4j 访问 win Shell32 API(感谢 Tom91136,如果您需要了解如何安装和初始化 com4j,请参阅 this)

此代码类获取 Windows 资源管理器中选定的文件或文件夹并进行打印。

import java.io.File;
import com4j.*;
import test.wsh.*;
import java.util.*;
import java.util.Timer;
import javax.swing.*;


public class DetectSelection {

public static void main(String[] argv)
{
list(); //there is a timer actually, calls every second
}

public static void list(){
System.out.println("SELECTION DETECT:");

String newResults="";

try
{
List<IWebBrowser2> browsers = getIWebBrowser2();
for(IWebBrowser2 browser : browsers){
IShellFolderViewDual3 view = getIShellFolderViewDual3(browser);
if (view != null && browser.visible()) {

FolderItems items = view.selectedItems();

for (Com4jObject object : items) {
FolderItem item = object.queryInterface(FolderItem.class);
if (item != null) {
newResults+=item.path()+" - "+item.type()+"\n\n";
}
}
}
}
}
catch(Exception error)
{
System.out.println("Error in list: "+error.toString());
}

System.out.println(newResults);
}

public static List<IWebBrowser2> getIWebBrowser2() {
// TODO this can be potentially optimized
try
{
List<IWebBrowser2> rWindows=new ArrayList<IWebBrowser2>();

IShellWindows windows = ClassFactory.createShellWindows()
.queryInterface(IShellWindows.class);
for (Com4jObject window : windows) {

IWebBrowser2 browser = window.queryInterface(IWebBrowser2.class);
rWindows.add(browser);
}
return rWindows;
}
catch(Exception error)
{
System.out.println("Error in getIWebBrowser2: "+error.toString());
return null;
}
}

public static IShellFolderViewDual3 getIShellFolderViewDual3(IWebBrowser2 browser) {
if (browser == null)
return null;

try
{
return browser.document().queryInterface(IShellFolderViewDual3.class);
}
catch(Exception error)
{
System.out.println("Error in getIShellFolderViewDual3: "+error.toString());
return null;
}
}
}

我只发布了必要的部分。我正在使用计时器定期检查打开的文件。每秒调用 list() 方法。它工作正常,但如果我关闭窗口,我会收到以下错误。

    com4j.ComException: 80004005 
.\invoke.cpp:517
at com4j.Wrapper.invoke(Wrapper.java:166)
at com.sun.proxy.$Proxy10.document(Unknown Source)
at DetectSelection.getIShellFolderViewDual3(DetectSelection.java:79)
at DetectSelection.list(DetectSelection.java:32)
Caused by: com4j.ComException: 80004005 Belirtilmemiş hata : Belirtilmemiş hata : .\invoke.cpp:517
at com4j.Native.invoke(Native Method)
at com4j.StandardComMethod.invoke(StandardComMethod.java:35)
at com4j.Wrapper$InvocationThunk.call(Wrapper.java:340)
at com4j.Task.invoke(Task.java:51)
at com4j.ComThread.run0(ComThread.java:153)
at com4j.ComThread.run(ComThread.java:134)

我开始使用 try-catch 并得到了这个:

Error in getIShellFolderViewDual3: com4j.ComException: 80004005  .\invoke.cpp:517

“IShellFolderViewDual3”方法有问题。

最佳答案

我猜你的问题是关于计时器的。如果有一个计时器并且 list() 方法每秒运行一次,那么当您关闭窗口时, getIShellFolderViewDual3() 方法也会同时尝试访问正在关闭的窗口。

使用前检查“浏览器”对象是否可见且不为空。

try
{
List<IWebBrowser2> browsers = getIWebBrowser2();
for(IWebBrowser2 browser : browsers){
if(browser.visible())
{

IShellFolderViewDual3 view = getIShellFolderViewDual3(browser);
if (view != null && browser.visible()) {

FolderItems items = view.selectedItems();

for (Com4jObject object : items) {
FolderItem item = object.queryInterface(FolderItem.class);
if (item != null) {
newResults+=item.path()+" - "+item.type()+"\n\n";
}
}
}
}
}
}

关于java - 获取打开的窗口和选定的项目时出现错误 com4j.ComException : 80004005 .\invoke.cpp:51,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29852443/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com