2015. 8. 18. 13:46ㆍIT-개발/winapi 및 MFC
내가 MFC로 만든 프로그램 소스에
잘못된 인수가 발견되었습니다(An invalid argument encountered) 라는 메세지가 나오도록 설정한 소스가 없음에도
다음 그림과 같은 메세지가 나오는 현상이 정말 간혹 있다.... 그 당혹스러움은~~
그럴 때에는 몇가지 이유가 있지만 다음 사례중에 하나 인듯하다. 가장 유력한 내용은 1번째 내용이다.
1.. (펌) anscii code 상에 화면에 나오지 않는 문자 코드값을 string에 사용. - MFC 관련 함수를 의심해서 찾아내자
한국어로 "잘못된 인수가 발견되었습니다", 영어로 "An invalid argument was encountered"
보통 MFC에서 존재하지 않는 리소스에 접근할때 접하는 에러이다...
그런데 다른경우에도 이 에러가 발생할 수 있다...
그 다른경우에 발생하는 이 빌어먹을 에러 메시지 때문에 며칠을 고생했는지...
상황은 이렇다...
소켓으로 유량계와 MODBUS RTU 방식으로 24시간 통신을 하고 있는 상황(시리얼통신이라고 이해해도 좋다) 이틀에 한번꼴로 상기 에러 메시지가 발생한다...재밌는건 저 메시지가 떠있을뿐 프로그램은 정상적으로 동작하고 있다. 물론 난 저런메시지를 뱉도록 코딩한적이 없다...한마디로 왜, 어떤 상황에서 저 메시지가 뜨는지 찾기가 힘든 상황...
배열에서 범위를 벗어났을때 저런 메시지가 난다고 하는 블로그가 있길래 strcpy, memcpy 같은 함수를 열라 뒤졌지만 상식적으로 저런 함수가 상기 메시지같은 예외오류를 낼 수는 없다...
결국 의심되는 모든 사용자 함수에 try, catch(CException* e)를 쓰면서 범위를 좁혀가다보니 일주일만에 결국 찾았다...
특수기호가 있는 문자열에서 CString의 MakeLower() 또는 MakeUpper()를 사용했을때 발생했다.
이 경우가 상기 에러메시지가 발생하는 모든 경우라고는 말 할수는 없겠지만 적어도 한가지 확실한 예와 비슷한 문제가 발생했을때 원인을 찾아갈 수 있는 방법을 올려놓는다. (행운이 있길 바란다)
"잘못된 인수가 발견되었습니다"라는 에러 메시지가 발생하는 경우의 예
BYTE byteData[256] = {0, };
for(int i = 0; i < 255; i++)
byteData[i] = i+1;
memcpy(szMsg, byteData, 255);
CStringA strMsg = szMsg;
strMsg.MakeLower(); //여기서 예외상황이 발생한다
원인을 찾아가는 방법
1. MFC에서 사용되는 함수를 의심한다
2. 의심되는 사용자 함수를 try, catch로 묶어가면서 에러가 발생하는 함수의 범위를 좁혀나간다
(상기 에러메시지가 발생할때는 CException* e로 예외에러를 throw 시킨다)
2. IP 또는 해당 포트가 없으면 발생하는 것 같습니다
3. MFC Code쪽에서 발견되는 듯~
- 아래와 같은 코드에서 CCommandLineInfo::FileOpen; 으로 입력되고, 파일 이름에 위에서 문제가되는 1번항목 코드의 문자가 들어있는 경우. File을 Open 하려는 동작을 실행하다가 나오는 듯~
CCommandLineInfo cmdInfo;
ParseCommandLine(cmdInfo);
cmdInfo.m_nShellCommand=CCommandLineInfo::FileNew;
cmdInfo.m_strFileName=_T("");
if(!ProcessShellCommand(cmdInfo))
return FALSE;
(참고)
// MFC Standard Exception Error messages
#define AFX_IDS_INVALID_ARG_EXCEPTION 0xF025
...
AFX_IDS_INVALID_ARG_EXCEPTION "잘못된 인수가 발견되었습니다."
와 같이 정의되어 있었습니다.
=================================================================================================
직접 검증해본건 (1)항목 뿐이긴 하나 지인들은 (3)도 확인됐단다~
'IT-개발 > winapi 및 MFC' 카테고리의 다른 글
특정 폴더를 한번에 삭제하기(폴더안 파일까지 포함) [펌] (0) | 2015.09.18 |
---|---|
CListCtrl 포커스 해제시 selection color 유지하기 (0) | 2015.08.21 |
Kernel Object / Object Handle (펌) (0) | 2015.08.18 |
CreateEvent 분석...(펌) (0) | 2015.08.11 |
Microsoft.Windows.Common-Controls 6.0 Style (0) | 2015.07.23 |