C++ win32 应用程序在我 select 文件对话框中的文件一段时间后冻结?
C++ win32 App is Freezing after a while i select a file from file dialog?
我是 运行 我的 Win32 应用程序 Windows 7 32 位。
我有以下两个函数在我的应用程序中创建冻结,但仅当 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] = '[=11=]';
ofn.nMaxFile = sizeof(FileName);
ofn.nMaxFileTitle = 0;
ofn.lpstrFilter = L"All Files[=11=]*.*[=11=][=11=]";
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()
功能时,如果互联网不可用,应用程序运行完美,没有问题,但是当应用程序通过 NetworkConnectionStatus()
更改状态并且互联网可用时,我的应用程序冻结没有任何作用,甚至是应用程序的托盘。我必须手动关闭它。
如果应用程序是 运行,当 Internet 可用并且我使用 BrowseSelectFile()
功能时,也会发生此应用程序冻结,
或者当我使用 BrowseSelectFile()
功能后可以上网时。过一会就冻结了,不是瞬间冻结,而是几秒、几分钟后,
应用程序完全死机,我只能手动关闭它。
什么会导致这样的问题?
我在 BrowseSelectFile()
函数中尝试了很多解决方法。也许它在 CloseHandle(&ofn);
之后包含 open
或 closes
main HWND
?
它甚至不会弹出任何错误或调试消息,它只是冻结。
我在这些功能中是否有任何错误可能导致这种冻结?
-----更新-答案----
非常抱歉:) 这两个函数没有错误。
我希望有人会发现它们有用,因为它们在所有 windows 版本中都能完美运行。
感谢 wireshark 和@gbjbaanb 的建议,我发现我正在使用查询来检查服务器数据库中的某些值,并且在应用程序可用于 Internet 后触发,因此它可以为 Internet 启用某些功能,该查询导致了冻结故障。
感谢大家的帮助和时间,我至少真正了解到调试是一个很好的方法,但由于我不是那么有经验,wireshark 确实帮助我找到了错误。
显然该函数正在调用资源管理器功能来浏览网络共享(和 webDAV
共享)。如果没有互联网,这些电话将 return 立即 "not available",如果有互联网,他们将尝试浏览和/或发现网络内容或至少其可用性。
我会在 Internet 上搜索 Internet 共享的 Explorer 相关问题。如果您的 "my network" 或 "network" 文件夹中没有明显可用的内容,那么您可能需要查看注册表并删除仍然停留在那里的旧条目,或删除任何旧的 webdav
可能已安装的软件包。
另一件可能有帮助的事情是将 OFN_NONETWORKBUTTON
添加到您的参数中(可能还有 OFN_SHAREAWARE
)。
我是 运行 我的 Win32 应用程序 Windows 7 32 位。
我有以下两个函数在我的应用程序中创建冻结,但仅当 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] = '[=11=]';
ofn.nMaxFile = sizeof(FileName);
ofn.nMaxFileTitle = 0;
ofn.lpstrFilter = L"All Files[=11=]*.*[=11=][=11=]";
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()
功能时,如果互联网不可用,应用程序运行完美,没有问题,但是当应用程序通过 NetworkConnectionStatus()
更改状态并且互联网可用时,我的应用程序冻结没有任何作用,甚至是应用程序的托盘。我必须手动关闭它。
如果应用程序是 运行,当 Internet 可用并且我使用 BrowseSelectFile()
功能时,也会发生此应用程序冻结,
或者当我使用 BrowseSelectFile()
功能后可以上网时。过一会就冻结了,不是瞬间冻结,而是几秒、几分钟后,
应用程序完全死机,我只能手动关闭它。
什么会导致这样的问题?
我在 BrowseSelectFile()
函数中尝试了很多解决方法。也许它在 CloseHandle(&ofn);
之后包含 open
或 closes
main HWND
?
它甚至不会弹出任何错误或调试消息,它只是冻结。
我在这些功能中是否有任何错误可能导致这种冻结?
-----更新-答案----
非常抱歉:) 这两个函数没有错误。 我希望有人会发现它们有用,因为它们在所有 windows 版本中都能完美运行。
感谢 wireshark 和@gbjbaanb 的建议,我发现我正在使用查询来检查服务器数据库中的某些值,并且在应用程序可用于 Internet 后触发,因此它可以为 Internet 启用某些功能,该查询导致了冻结故障。
感谢大家的帮助和时间,我至少真正了解到调试是一个很好的方法,但由于我不是那么有经验,wireshark 确实帮助我找到了错误。
显然该函数正在调用资源管理器功能来浏览网络共享(和 webDAV
共享)。如果没有互联网,这些电话将 return 立即 "not available",如果有互联网,他们将尝试浏览和/或发现网络内容或至少其可用性。
我会在 Internet 上搜索 Internet 共享的 Explorer 相关问题。如果您的 "my network" 或 "network" 文件夹中没有明显可用的内容,那么您可能需要查看注册表并删除仍然停留在那里的旧条目,或删除任何旧的 webdav
可能已安装的软件包。
另一件可能有帮助的事情是将 OFN_NONETWORKBUTTON
添加到您的参数中(可能还有 OFN_SHAREAWARE
)。