为什么第二次调用RasGetEntryProperties()会返回重叠的I / O操作?

时间:2017-11-06 08:02:15

标签: c winapi

有这样的代码:

#include <ras.h>
#include <raserror.h>
#include <stdio.h>
#include <windows.h>

int main(int argc, char** argv) {
    DWORD dwEntryInfoSize = 0;
    DWORD dwDeviceInfoSize = 0;
    DWORD dwRet = 0;
    LPRASENTRY lpRasEntry = NULL;
    LPBYTE lpDeviceInfo = NULL;

创建RAS连接。获取默认电话簿条目的缓冲区大小调整信息。

    if ((dwRet = RasGetEntryProperties(NULL, "", NULL, &dwEntryInfoSize, NULL, &dwDeviceInfoSize)) != ERROR_SUCCESS) {
        if (dwRet != ERROR_BUFFER_TOO_SMALL) {
            printf("RasGetEntryProperties error: %s\n", GetLastError());

            return EXIT_FAILURE;
        }
    }

    if (dwEntryInfoSize == 0) {
        printf("Entry info size error: %s\n", GetLastError());

        return EXIT_FAILURE;
    }


    lpRasEntry = (LPRASENTRY) HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwEntryInfoSize);

    if (lpRasEntry == NULL) {
        printf("HeapAlloc RasEntry error: %s\n", GetLastError());

        return EXIT_FAILURE;
    }

    if (dwDeviceInfoSize) {
        lpDeviceInfo = (LPBYTE)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, dwDeviceInfoSize);
    }

    lpRasEntry->dwSize = sizeof(RASENTRY);

这里有一个错误:重叠的I / O操作正在进行中。在Windows XP和Windows 10中出现错误一切正常。我需要这段代码才能在XP中运行。

    if ((dwRet = RasGetEntryProperties(NULL, "", lpRasEntry, &dwEntryInfoSize, lpDeviceInfo, &dwDeviceInfoSize)) != ERROR_SUCCESS) {
        printf("RasGetEntryProperties error: %s\n", GetLastError());

        return EXIT_FAILURE;
    }

    // Validate new phonebook name "TestEntry"
    if ((dwRet = RasValidateEntryName(NULL, "TestEntry")) != ERROR_SUCCESS) {
        printf("RasValidateEntryName error: %s\n", GetLastError());

        return EXIT_FAILURE;
    }

    // Install a new phonebook entry, "TestEntry", using default properties
    if ((dwRet = RasSetEntryProperties(NULL, "TestEntry", lpRasEntry, dwEntryInfoSize, lpDeviceInfo, dwDeviceInfoSize)) != ERROR_SUCCESS) {
        printf("RasSetEntryProperties error: %s\n", GetLastError());

        return EXIT_FAILURE;
    }

    // Deallocate memory for the connection buffer
    HeapFree(GetProcessHeap(), 0, lpRasEntry);
    lpRasEntry = NULL;

    return EXIT_SUCCESS;
}

此代码创建拨号连接。我坚持这个错误。

enter image description here

1 个答案:

答案 0 :(得分:0)

代码显示错误......

错误#1:Ras *函数不为GetLastError()设置错误代码。那些GetLastError()没有意义。它们将错误代码返回为DWORD。在MSDN中读取路由和远程访问错误代码。

错误#2:在RasGetEntryProperties()函数5和6中以NT开头,参数未使用且应为NULL。

错误#3:最阴险的。事实上,某些Windows操作系统的RASENTRY结构的大小是不同的。例如,在XP和10之间。因此,在头文件中的某个地方,我们应该指定如下内容:

#define WINVER 0x0501
#define _WIN32_WINNT 0x0501

可以在MSDN中阅读更多详细信息。修改WINVER和_WIN32_WINNT。在这种情况下,我们指定了Windows XP的版本。这就是我所需要的。在这种情况下,重叠的I / O操作正在进行中与我们无关。我们只输出GetLastError()的结果,当执行前面的函数时,它可能出现在Windows的深处。