windows - Fungerer CancelSynchronousIo med WNetAddConnection2?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg forsøger og undlader at annullere et opkald til WNetAddConnection2 med CancelSynchronousIo. [2] [3]


Opkaldet til CancelSynchronousIo lykkes, men intet er faktisk annulleret.


Jeg bruger en 32-bit konsol-app, der kører på Windows 7 x64.


Har nogen gjort det med succes? Gør jeg noget dumt? Her er en prøvekonsol-app (som skal forbindes med mpr.lib):


DWORD WINAPI ConnectThread(LPVOID param)
{
    NETRESOURCE nr;
    memset(&nr, 0, sizeof(nr));
    nr.dwType = RESOURCETYPE\_ANY;
    nr.lpRemoteName = L"\\8.8.8.8\bog";

    // result is ERROR\_BAD\_NETPATH (i.e. the call isn't cancelled)
    DWORD result = WNetAddConnection2(&nr, L"pass", L"user", CONNECT\_TEMPORARY);

    return 0;
}

int \_tmain(int argc, \_TCHAR* argv[])
{
    // Create a new thread to run WNetAddConnection2
    HANDLE hThread = CreateThread(0, 0, ConnectThread, 0, 0, 0);
    if (!hThread)
        return 1;

    // Retry the cancel until it fails; keep track of how often
    int count = 0;
    BOOL ok;
    do
    {
        // Sleep to give the thread a chance to start
        Sleep(1000);
        ok = CancelSynchronousIo(hThread);
        ++count;
    }
    while (ok);

    // count will equal two here (i.e. one successful cancellation and
    // one failed cancellation)

    // err is ERROR\_NOT\_FOUND (i.e. nothing to cancel) which makes
    // sense for the second call
    DWORD err = GetLastError();

    // Wait for the thread to finish; this takes ages (i.e. the
    // WNetAddConnection2 call is not cancelled)
    WaitForSingleObject(hThread, INFINITE);

    return 0;
}

Bedste reference


Ifølge Larry Osterman (jeg håber, at han ikke har noget imod mig at citere ham): 'Spørgsmålet blev besvaret i kommentarerne: wnetaddconnection2 er ikke et simpelt IOCTL-opkald.' Så svaret er desværre ingen.