0
GetOverlappedResults()이 전혀 반환되지 않습니다.
간단한 예제를 실행했고 네트워크 인터페이스에 IP 주소가 변경되면 수동 재설정 이벤트가 설정되고 "IP 주소 테이블이 변경되었습니다."라는 출력이 표시 될 수 있지만 GetOverlappedResults()는 반환하지 않습니다. bWait 거짓입니다. bWait = true 인 경우에도 이벤트가 설정되어 I/O 작업이 완료되었으므로 리턴해야합니다.bWait = false 인 GetOverlappedResults 블록
무슨 일입니까?
#include <winsock2.h>
#include <iphlpapi.h>
#include <stdio.h>
#include <windows.h>
#pragma comment(lib, "iphlpapi.lib")
#pragma comment(lib, "ws2_32.lib")
void main()
{
OVERLAPPED overlap;
DWORD ret, nr;
HANDLE hand = NULL;
overlap.hEvent = CreateEvent(NULL, true, false, NULL);
ret = NotifyAddrChange(&hand, &overlap);
for (;;)
{
if (WaitForSingleObject(overlap.hEvent, INFINITE) == WAIT_OBJECT_0)
{
printf("IP Address table changed..\n");
ret = GetOverlappedResult(hand, &overlap, &nr, false);
scanf_s("%d %d\n", ret, nr);
printf("done\n");
NotifyAddrChange(&hand, &overlap);
ResetEvent(overlap.hEvent);
}
}
}
ret == ERROR_IO_PENDING인지 확인해야합니다. 그 scanf_s() 호출은 끔찍한 잘못입니다. 맬웨어 방지 도구 등을 사용하지 마십시오. –
공식 샘플과 동일한 문제가 있습니까? http://msdn.microsoft.com/en-us/library/windows/desktop/aa366329(v=vs.85).aspx 한스 (Hans)가 말하는 것과 같습니다. – usr
'NotifyAddrChange()'와 같은 함수에 전달하기 전에'OVERLAPPED' 인스턴스의 메모리를 소거해야합니다. 초기화되지 않은 가비지 메모리를 전달 중입니다. –