C++ win32 应用程序在我从文件对话框中选择文件一段时间后卡住?

标签 c++ winapi getopenfilename

我在 Windows 7 32 位上运行我的 Win32 应用程序。

我有以下两个函数可以在我的应用程序中创建一个卡住,但仅当 Internet 可用时:

HWND mainHwnd;

// When i want to add a file somewhere in the app 
_bstr_t BrowseSelectFile(){

    _bstr_t FileSelected;
    OPENFILENAME ofn;
    TCHAR FileName[MAX_PATH];
    HWND hwn = mainHwnd // setted in global variable from main events 
    //INT_PTR CALLBACK WindowRes(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam) mainHwnd = hwnd;

    ZeroMemory(&ofn, sizeof(ofn));
    ofn.lStructSize = sizeof(ofn);
    ofn.hwndOwner = hwn;
    ofn.lpstrFile = FileName;
    ofn.lpstrFile[0] = '\0';
    ofn.nMaxFile = sizeof(FileName);
    ofn.nMaxFileTitle = 0;
    ofn.lpstrFilter = L"All Files\0*.*\0\0";
    ofn.nFilterIndex = 1;

    ofn.Flags = OFN_EXPLORER | OFN_DONTADDTORECENT | OFN_FILEMUSTEXIST | OFN_FORCESHOWHIDDEN | OFN_PATHMUSTEXIST;

    if (!GetOpenFileName(&ofn)){
        FileSelected  = "false";
    }else{
        FileSelected = FileName;
    }

    CloseHandle(&ofn);
    return FileSelected;
}

// A function that runs each second to check if the internet is available or not
_bstr_t NetworkConnectionStatus(){

    _bstr_t IntStatus;
    string Check = "false";

    DWORD dwResult;
    HRESULT fr = 0;
    fr = CoInitialize(NULL);
    if (SUCCEEDED(fr)){
        INetworkListManager *networkListManager = NULL;
        fr = CoCreateInstance(CLSID_NetworkListManager, NULL, CLSCTX_ALL, IID_INetworkListManager, (LPVOID*)&networkListManager);
        if (SUCCEEDED(fr)){
            VARIANT_BOOL vb = 0;
            fr = networkListManager->get_IsConnectedToInternet(&vb);
            if (SUCCEEDED(fr)){
                if (vb){
                    Check = "true";
                }
            }
        }
        networkListManager->Release();
    }
    CoUninitialize();

    if (Check == "true"){
        IntStatus = "true";
    }else{
        IntStatus = "false";
    }

    return IntStatus;

}

当我根本不使用 BrowseSelectFile() 函数时,应用程序工作正常,从不出现问题或错误,无论 Internet 是否可用。

当我使用 BrowseSelectFile() 函数时,如果 Internet 不可用,应用程序运行完美,没有问题,但是当应用程序通过 NetworkConnectionStatus() 更改状态并且互联网可用,我的应用程序卡住并且没有任何作用,甚至应用程序的托盘也不行。我必须手动关闭它。

如果应用程序在 Internet 可用时运行并且我使用 BrowseSelectFile() 函数,也会发生此应用程序卡住, 或者当我使用 BrowseSelectFile() 函数后可以访问 Internet 时。过一会就卡住了,不是瞬间卡住,而是几秒、几分钟后, 应用程序完全死机,我只能手动关闭它。

什么会导致这样的问题?

我在 BrowseSelectFile() 函数中尝试了很多解决方法。也许它在 CloseHandle(&ofn); 之后持有 openclosesmain HWND

它甚至不会弹出任何错误或调试消息,它只是卡住。

我在这些功能中是否有任何错误可能导致这种卡住?

----- 更新 - 回答 ----

非常抱歉 :) 这两个函数没有错误。 我希望有人会发现它们很有用,因为它们在所有 Windows 版本上都能完美运行。

感谢 wireshark 和@gbjbaanb 的建议,我发现我正在使用查询来检查服务器数据库中的某些值,并且在应用程序可用于 Internet 后触发,因此它可以为 Internet 启用某些功能,即查询导致此卡住故障。

感谢大家的帮助和时间,我至少真正了解到调试是一个很好的方法,但由于我经验不足,wireshark 确实帮助我找到了错误。

最佳答案

显然,该函数正在调用资源管理器功能来浏览网络共享(和 webDAV 共享)。如果没有互联网,这些电话将立即返回“不可用”,如果有互联网,他们将尝试浏览和/或发现网络内容或至少其可用性。

我会在互联网上搜索与互联网共享有关的资源管理器相关问题。如果您的“我的网络”或“网络”文件夹中没有任何明显可用的内容,那么您可能需要查看注册表并删除仍然停留在那里的旧条目,或者删除任何旧的 webdav 可能已安装的包。

另一件可能有帮助的事情是将 OFN_NONETWORKBUTTON 添加到您的参数中(也可能是 OFN_SHAREAWARE)。

关于C++ win32 应用程序在我从文件对话框中选择文件一段时间后卡住?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49943307/

相关文章:

c++ - 数组作为 const 指针

c++ - 相当于Qt中的Win32 'SetProp'?

c++ - GetSaveFileName 失败并显示 CDERR_FINDRESFAILURE

excel - 如何只获取文件名而不是打开文件的整个文件路径?

c++ - 无法在同一文件中定义 2 个不同类的构造函数

c++ - timer_create 和 timerid,这允许吗?

delphi - 使用 SHGetSpecialFolderPath 检索非管理员用户也可以访问的应用程序文件夹,选择哪个 CSIDL?

c - 检测 COM 端口是否已关闭

string - 在 VBA 中获取OpenFileNameW?

c++ - 如何将基类的枚举传递给子类的构造函数