본문 바로가기

운동하는 개발자/Windows

WinInet httpsendrequest() 멈춤, 응답없음, 오류

728x90

기존의 exe로 된 프로세스를 DLL로 변환하는 작업 중 프로그램이 멈추는 현상이 확인되었다.

디버깅 결과 WinInet의 httpsendrequest() 함수에서 아무런 응답을 주지 않았다.

https://learn.microsoft.com/ko-kr/windows/win32/api/wininet/nf-wininet-httpsendrequesta

 

HttpSendRequestA 함수(wininet.h) - Win32 apps

지정된 요청을 HTTP 서버로 보내 호출자가 일반적으로 HttpSendRequestEx에 전달되는 것 이상으로 추가 데이터를 보낼 수 있도록 합니다. (ANSI)

learn.microsoft.com

 

하다못해 에러라도 발생하면 오류코드 검색을 해 볼 텐데 아무런 응답 없이 멈춰만 있으니 답답했다.
그래서 해당 함수로 전달하는 파라미터 부터 검사하였는데 해당 통신 모듈은 기존에 정상적으로 사용하고 있는 로직이었으며 InternetOpen(), InternetConnect(), hInternetOpenRequest(), HttpQueryInfo() 모두 순차적, 정상적으로 핸들을 리턴하며 오류없이 잘 진행되고 있었고 기존 exe프로그램과 비교해서도 httpsendrequest()에 전달되는 파라미터엔 문제가 없음을 확인했다.

그래서 찾다 찾다 위 링크의 MS Learn 페이지에서 눈에 들어오는 한 문장

 

내 로직의 경우 MFC DLL이였기에 메인 클래스가 존재하고 거기서 메인 Dialog class를 생성하는 방식이었고 메인 Dialog Class의 생성자 OnInitDialog()에서는 WinInet을 초기화하고 config데이터를 웹통신으로 획득하는 로직이 있었다.

결론적으로 MFC클래스가 생성되며 (OnInitDialog) WinINet의 API를 사용하면 정상작동을 하지 않는게 문제였다.

따라서 메인 Dialog Class를 생성하는 로직에서 기존에 하던일들을 모두 제거해 주고 별도로 Init함수를 만들어 클래스가 생성된 후 일을 하도록 변경해 주고 정상 작동을 확인하였다.

실질적으로 2일이나 날려먹었던 문제.. 왜 생성자에서 하면 정상작동하지 않는지..? 

빨리  Microsoft fuxxking classes 를 갖다 버려야 하는데..

ㅠㅠ

728x90