繁体   English   中英

我从文件对话框中选择一个文件后,C ++ win32 App正在冻结吗?

[英]C++ win32 App is Freezing after a while i select a file from file dialog?

我在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是否可用,该应用程序都可以正常运行,并且永远不会出现问题或错误。

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

此应用程序冻结也发生在应用程序运行时,互联网接入和我使用BrowseSelectFile()函数,或当互联网变得可用后,我已经使用了BrowseSelectFile()函数。 它会在一段时间后冻结,这不是立即冻结,但是在几秒钟或几分钟后,该应用程序完全冻结,除了手动关闭之外,我无法执行任何其他操作。

什么会引起这种问题?

我在BrowseSelectFile()函数中尝试了许多解决方法。 也许在CloseHandle(&ofn);之后,它可以opencloses main HWND CloseHandle(&ofn);

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

这些功能是否存在任何可能导致这种冻结的错误?

-----更新-解答----

非常抱歉:)这两个功能没有错误。 我希望有人会发现它们有用,因为它们可以在所有Windows版本上正常工作。

多亏了wireshark和@gbjbaanb的建议,我发现我正在使用查询来检查服务器数据库中的某些值,并且在应用程序可用于Internet之后触发,因此它可以启用Internet的某些功能,该查询导致这种冻结故障。

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

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

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

这可能有助于另一件事是在添加OFN_NONETWORKBUTTON为您的参数(也可能是OFN_SHAREAWARE一个太)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM