c - 如何检查与网络驱动器的连接?

标签 c windows winapi

我有一个应用程序使用 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 来解决这个问题?

提前致谢。

最佳答案

上面的评论是正确的。网络内容不应在 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

关于c - 如何检查与网络驱动器的连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18306157/

相关文章:

sql - 正在寻找编译器,有什么想法吗?

objective-c - 如何在 OSX 中以编程方式获取 GPU 温度?

Windows CMD 文件/文件夹压缩使用 7z 或替代 .tar.gz

c++ - 使用对象方法作为 WinApi WndProc 回调

c - 强制使用 ANSI 编辑控件而不是 comctl32 编辑控件

c - 在子进程中使用 fork() 的斐波那契

c - 在 C 循环中释放子字符串

java - 如何检测 Java 应用程序(Windows 操作系统)中的重绘区域?

windows - Windows : unknown function vundle#begin 上的 Vim Vundle 安装

c# - 获取当前鼠标光标类型