4

我有一个应用程序,它使用WNetAddConnection2().

    NETRESOURCE nr = {0,};
    nr.dwType = RESOURCETYPE_ANY; 
    nr.lpLocalName = nullptr; 
    nr.lpRemoteName = L"\\\\MyNetworkDrive\\MyFolder\\"; 
    nr.lpProvider = nullptr; 

    DWORD ret = WNetAddConnection2 (&nr, L"MyPW", L"MyID", CONNECT_UPDATE_PROFILE); //add connection

    // A few seconds needed to invoke StartWritingFiles();    

    StartWritingFiles();

WNetAddConnection2似乎需要如此繁重的工作才能返回,这使得应用程序看起来冻结。

所以我想我可以避免在与 MyNetworkDrive 的连接处于活动状态时调用它

我应该寻找哪个 API 来解决这个问题?

提前致谢。

4

1 回答 1

2

上面的评论是正确的。网络的东西不应该在 UI 线程上完成。但是,如果您不想线程化,我相信您想枚举所有打开的连接以查看您想要的资源是否已连接。像这样尝试 WNetOpenEnum:

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <Winnetwk.h>
#include <stdio.h>

#pragma comment(lib,"Mpr.lib")

VOID main(){

    HANDLE hEnum = (HANDLE)0;

    DWORD dwError = WNetOpenEnum(RESOURCE_CONNECTED,RESOURCETYPE_DISK,0,NULL,&hEnum);

    if (dwError == NO_ERROR){

        DWORD dwCount = -1;

        CHAR szBuff[1000];

        ZeroMemory(szBuff,sizeof(szBuff));

        DWORD dwSize = sizeof(szBuff);

        dwError = WNetEnumResource(hEnum,&dwCount,szBuff,&dwSize);

        if (dwError == NO_ERROR){

            NETRESOURCE *pnr = (NETRESOURCE*)szBuff;

            for (DWORD d = 0; d < dwCount; d++){

                if (pnr[d].lpRemoteName){

                    printf("%s\n",pnr[d].lpRemoteName);

                }

            }

        }

        WNetCloseEnum(hEnum);

    }else{

        printf("Failed: %u\n",dwError);

    }

}

这有点骇人听闻,因为我假设所有连接都适合 1000 个字节。您可以在此处阅读有关 WNetOpenEnum 和相关功能的信息:

http://msdn.microsoft.com/en-us/library/windows/desktop/aa385478%28v=vs.85%29.aspx

于 2013-08-21T02:07:10.773 回答