상세 컨텐츠

본문 제목

MFC - CFileDialog 주의사항. 프로그램의 자신경로 설정변경으로 인한 오류참고 (참고 키워드 MFC, LoadImage, 리턴, 리턴값, 0x00000000, NULL, CFileDialog)

프로그래밍 관련/MFC

by AlrepondTech 2017. 10. 12. 16:52

본문

반응형
728x170

 

 

 

 

=================================

=================================

=================================

 

 

 

 

 

 

 

출처: http://egloos.zum.com/indra207/v/5182220

 

 

이미지를 경로 지정하여 LoadImage로 불러들일때 상대경로를 사용할때,

CFileDialog 대화상자를 사용하게 되면 작업경로가 바뀌므로

이미지를 찾을 수 없어 NULL값을 리턴하게 됩니다.

CFileDialog.DoModal() 을 호출하기 전에 GetCurrentDirectory() 함수를 이용해 작업경로를 백업해두고,

DoModal() 호출 후 바뀐 작업경로를 SetCurrentDirectory() 함수로 재설정해야합니다.

예)
 CString loadFileInfo;
 char szFilter[] = "Coordi File(*.ccf)|*.ccf|";
 CFileDialog fileDlg( TRUE, "Coordi File(*.ccf)", NULL, OFN_HIDEREADONLY, szFilter );

 char tmpPath[255] = "";
 GetCurrentDirectory( 255, tmpPath );

 if( fileDlg.DoModal() == IDOK )  
 {
    loadFileInfo = fileDlg.GetPathName();
 }
 SetCurrentDirectory( tmpPath );


===============================================================================
다른 방법 
===============================================================================

CFileDialog 를 사용하면 작업폴더가 바뀌는 문제가 발생한다.

 

 

해결법

 

1. ::GetCurrentDirectory(), ::SetCurrentDirectory() 함수를 사용해서 경로를 고정시킨다.

 

2. CFIleDilaog Dlg(..., ..., ..., .. | OFN_NOCHANGEDIR, ... ); 플래그를 추가해서 고정시킨다.

 

* 위에 두 방법이 다 안통할 때가 있다..

   GetCurrentDirectory(), SetCurrentDirectory() 를 이용해서 폴더가 바뀐것을 확인을 했지만

   막상 CFileDialog 를 보면 마지막에 부른 파일의 경로로 바껴있다.

   해결법 :

        CFileDialog Dlg 선언후  

                  Dlg.m_ofn.lpstrInitialDir = "원하는 경로";

        로 해버리면 원하는 경로에서 바뀐것을 확인할 수 있다.

 

  ( 문제는 위의 두방법이 안되는 이유를 모른다는것..)

 

=================================

=================================

=================================

 

 

 

 

반응형

 

 

728x90

 

 


출처 : http://www.tipssoft.com/bulletin/tb.php/old_bbs/59

 

[질문 내용] 

안녕하세요. 

TipsWare 3번째 인터페이스를 사용중입니다. 다이얼로그 베이스로 개발중인데.. 
기본 다이얼로그 박스에서 버튼을 누르면 또 새로운 다이얼로그 박스가 뜨거든요. 
근데 이 새로운 다이얼로그박스가 첨 뜰때는 이미지(로고, 체크박스, 라디오버튼 같은..)가 잘뜨는데.. 
기본 다이얼로그 박스에서 CFileDialog 박스로 어떤 파일을 하나 열고나면 새로운 다이얼로그박스에서 
이미지들이(image 폴더에 있는) 나오지를 않네요.. 

제 생각에는 대충 CFileDialog에서 파일 경로가 변경되서 그런거 같은데.. 
어떻게 해결 해야 하는지 답변 부탁드립니다..^^; 

[답변 내용] 

안녕하세요~! 

CFileDialog를 사용하면 내부 작업 경로가 변경되어서 이미지 파일을 정확하게 읽어 오지 못합니다. 
따라서 CFileDialog를 사용하기 전에  

GetCurrentPath 

함수를 이용하여 현재 작업 경로를 배열에 기억시킨후에, CFileDialog 작업이 끝난후, 

SetCurrentPath 

함수를 이용하여 기억시킨 경로를 다시 설정해주면 됩니다. 

정리하면, GetCurrentPath는 CFileDialog 를 선언하기 전에 사용해야 하구... 
SetCurrentPath는 CFileDialog를 DoModal 한 이후에 사용해야 합니다. 

그럼, 즐거운 하루되세요~! 

[추가답변-즐거운악몽님이 답변하신 내용입니다.] 

보통 CFileDialog 대화상자를 사용하다보면 간간히 경로 변경 문제로 인해 원치 않는 결과를 얻게 
되기도 합니다. 일반적으로 프로그램 즉 aa.exe 를 실행 시키면 그 파일이 실행된 폴더의 위치가 
작업경로가 됩니다. 

예로 c:\\work\\a.exe 를 실행 시켰다면 작업경로는 c:\\work\\ 가 되죠. 이때 CFileDialog 대화상자를 
이용하면 이 작업경로가 변경되곤합니다. 

CFileDialog 대화상자를 DoModal() 한 후 이리저리 폴더를 움직이고나서 OK 버튼을 누르면...... 
그 마지막 경로가 작업경로로 지정됩니다. 

예로 CFileDialog 대화상자를 호출한 후 c:\\sample\\ 이동, 그리고 OK버튼을 눌렀다면 이제부터 
작업 경로는 c:\\work\\ 가 아니라 c:\\sample\\ 인 것입니다. 이때 이후부터는 상대경로를 사용한 
코드를 만나게 되면 문제가 발생되는것이죠 프로그래머가 .\\\\image\\\\aa.bmp 를 로드하는 코드를 
넣었다면 원래는 c:\\work\\image\\aa.bmp 를 로드 해야 하는데 CFileDialog 대화상자로 인해 작업 
경로가 변경되었으니 c:\\sample\\image\\aa.bmp 를 로드 하려 시도하게 된다는 것입니다...따라서 
원치 않는 작업이 이루어 지게됩니다. 

따라서 CFileDialog 대화상자를 호출하는 부분에 코드에 아래와 같이 변경해 보시길 바랍니다. 

 char path[MAX_PATH] = {0}; 
 //현재의 작업경로를 얻어와 저장 한다. 
 GetCurrentDirectory(MAX_PATH, path); 

 CFileDialog dlg(FALSE); 
 if(dlg.DoModal()==IDOK){ 
    // 가장 마지막에 저장해 두었던 작업경로로 다시금 세팅한다. 
    SetCurrentDirectory(path); 

    // 하고픈 작업코드..... 
 } 

혹 이미 위의 코드를 사용중이신데도 문제가 발생되는것이라면 좀더 자세한 설명 부탁드립니다... 
그리고 새로이 추가하신 대화상자의 속성이 STYLE 탭에서 ......style -> POPUP 지정, 
border -> None 을 지정하셨는지, 그리고 모든 CDialog 를 StandardDialog 로 변경하셨는지 체크해 
보시길 바랍니다.. 

그럼 즐거운 하루되세요!!!

===============================================================

 

 

 

=================================

=================================

=================================

 

 

 

 

출처: http://hueji.tistory.com/23

 

 

난 계속 CFileDialog를 사용하면서 경로 설정때문에 ::SetCurrentDirectory도 같이 사용해줬는데

CFileDialog는 SetCurrentDirectory랑은 상관없는것같다. 경로 NULL로 했는데도 반응이 없음.

 

 

암튼 

사용하는거 자체엔 문제가 없을 지 모르나 사용하고 난 후 나중에 ::WritePrivateProfileString을 사용해서 상당히 당황스러운 버그를 만났다.

 

요지는 이렇다. 난 #define INIFILE _T(".\\program.ini") 를 코딩해놓고 WritePrivateProfileString에 사용하는데

루트경로?를 SetCurrentDirectory에서 설정했던 경로대로 써버린다는 것이다.

결국 내가 마지막에 파일을 열었거나 저장한 곳에 program.ini 파일이 생성되게 된다.

다만 이걸 모를뿐...ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ

함수는 FALSE가 아닌 TRUE를 리턴하질 않나, 프로그램 최초 시작 시 아무 동작도 안하면 정상적으로 inifile이 생성되질 않나

 

갑자기 삘이 확 와서 파일검색으로 찾아본 후에 해결함ㅡ.ㅡ

 

근데 이런 버그? 상황은 Windows 7에서는 볼 수 없고 Windows XP에서만 볼 수 있다.

Windows 7으로 개발하다가, XP 쓰시던 선임님께 프로그램 보내드리고 한두번 해보는데 안되서 개당황ㅋㅋㅋㅋㅋㅋ

덕분에 버그 하나를 해결할 수 있었지만.

 

그리고 모든 API 함수에 이런 버그가 적용되는 것인진 알 수 없고 이유도 잘 모르겠당...

 

아무튼, 주의해야겠다.

 

 

 



출처: http://hueji.tistory.com/23 [HUEJIBOX]

 

 

 

=================================

=================================

=================================

 

 

반응형
그리드형


관련글 더보기

댓글 영역