MFC는 빌드 환경에 따라서 재배포 패키지가 필요하다

Microsoft Visual C++ Redistributable


VS에서 지정한 버전의 컴파일러로 빌드하면

그에 상응하는 재배포 패키지가 있어야 실행이 된다.


그러므로 사용하는 프로젝트의 빌드가 사용하는 재배포 패키지를 포함시켜서

실행의 안정성을 확보하는 것이 좋다.


예를 들어 VS2013에서 빌드한 프로젝트가 Windows 7 혹은 XP에서는 실행 안될 확율이 높다.

그럴 때는 2013 재배포 패키지를 설치하게 한다.

Microsoft Visual C++ Redistributable 2013



프로젝트 초기화 부분에서 다음 코드를 넣는다.


DWORD dwType = REG_SZ;

DWORD dwSize = 128;

HKEY hKey;

TCHAR szBuffer[128] = { '\0', };

LONG lResult = RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\{F8CFEB22-A2E7-3971-9EDA-4B11EDEFC185}", 0, KEY_READ, &hKey);

if (ERROR_SUCCESS != lResult)

{

AfxMessageBox("재배포 패키지를 설치하겠습니다.");

WinExec("vcredist_x86.exe /qb!", SW_SHOW);

AfxMessageBox("설치 완료");

// xp에선 설치완료후 정확하게 뜨지만 Windows7에선 완료되지 않았는데 뜬다.

}

else

{

//AfxMessageBox("이미 설치됨");

}


본인이 재배포할 패키지의 product code는 다음 링크를 참고 하면 된다.

재배포패키지 product code list

by 무위자연 2016. 6. 30. 12:04

MFC에 클래스를 추가하고

해당 클래스 로직에서 SetTimer / KillTimer를 사용할 경우에

릴리스 모드(Release)모드에서는 애러가 나지 않으나 정상 동작 하지 않고

디버그 모드(Debug)모드에서는 하기와 같이 애러가 날 때가 있다.


---------------------------

Microsoft Visual C++ Runtime Library

---------------------------

Debug Assertion Failed!


Program: ...r\Documents\º´¿ø¿ëÇ÷´ç±â\trunk\DMTool.N\Debug\iCE DM Tool.exe

File: f:\dd\vctools\vc7libs\ship\atlmfc\include\afxwin2.inl

Line: 152


For information on how your program can cause an assertion

failure, see the Visual C++ documentation on asserts.


(Press Retry to debug the application)


---------------------------

중단(A)   다시 시도(R)   무시(I)   

---------------------------

빌드시에 warning도 안 나고 error도 없는 상태라 사람 환장하게 한다.

그렇다고 ontimer 이벤트 내에서 뭔가가 일어나기도 전에 이미 경고가 뜬다.

구글 검색해보면 윈도우가 없어서 발생하는 것이라고 나온다.

그 의미를 몰랐는데.

MFC에서는 윈도우가 없다는 것의 의미는 윈도우에 UI component와 연결되어 있지 않다는 의미인 것이다.

그래서 해당 클래스를 UI Component 아무거나 상속 받은 다음에 하기와 같이 연결해준 상태에서 사용하면 된다.

ex
사용할 클래스 선언.

class CHIDCOM : public CEdit

Dlg 클래스에서의 추가
.h에서
CHIDCOM m_hidCom;

.cpp에서
DDX_Control(pDX, IDC_EDIT_HID, m_hidCom);


by 무위자연 2016. 1. 26. 14:18

사용할려는 클래스에선 상관 없는 애러가


CDiaolog를 상속 받는 include 당하는 클래스에서 다음과 같은 애러가 난다.


개 짜증.

trunk\dmtool.n\dmtool\DMToolDlg.h(24): error C2065: 'IDD_DMTOOL_DIALOG' : undeclared identifier


이런식으로....


이럴 때는 resource.h를 넣어서 간단하게 해결!!


도움 받은 포스팅은 다음과 같습니다.!!! 


http://acebluebird.tistory.com/entry/%EB%8B%A4%EC%9D%B4%EC%96%BC%EB%A1%9C%EA%B7%B8-%EC%B6%94%EA%B0%80%EC%8B%9C-%EC%9D%B4%EC%9C%A0%EC%97%86%EB%8A%94-error-C2065-error-C2057-%EB%A9%94%EC%8B%9C%EC%A7%80-%ED%95%B4%EA%B2%B0%EB%B0%A9%EB%B2%95

by 무위자연 2016. 1. 22. 09:53

일반적인 파일 저장은 fopen / fprintf / fclose를 이용한다.


m_result_file = fopen(".\\DATA\\data.csv", "a");

if(m_result_file != NULL)

{

fprintf(m_result_file, 변수1, 변수 2 ... 등등 + CString("\n")

);

fclose(m_result_file);

}


해당 코드로는 CString을 이용한 파일 쓰기가 안되고 구글 검색 시에 나오는 파일 쓰기는 오류 등이 있다,

그래서 구글링 결과 다음과 같이 처리할 경우에 문제가 없어서 남겨둔다.


추가 팁으로 파일 존재 유무 코드가 있다.


WIN32_FIND_DATA finddata;

ZeroMemory(&finddata, sizeof(finddata));

HANDLE hExist = FindFirstFile(filepath, &finddata);

if(hExist == INVALID_HANDLE_VALUE) {

//이 경우에 파일이 없다는 뜻.

}

TCHAR *szPath;

int nLen;


TCHAR szTemp[2];

WORD wd = 0xfeff;

memcpy(szTemp, &wd, 2); // CString 변환하여 파일에 쓸 경우에 반드시 open 후 첫번째 이 문자열을 넣어줘야 한다.

csvfile.Write(szTemp, 2);

titleStr.Format(_T("~~~~~~~~~~~~~~~~~~~~~~~~~~~~")); //CString을 적당히 편집한다.

szPath = new TCHAR[titleStr.GetLength() + 1];


_tcscpy(szPath, titleStr);


nLen = _tcslen(szPath);


csvfile.Write(szPath, nLen * sizeof(WCHAR));


csvfile.Close();

잘 써짐. 기존에서는 CSV의 컬럼 구분자가 ","였으나 이렇게 사용할 경우에 "\t"이 구분자가 되니 참고 한다.



by 무위자연 2015. 2. 13. 10:49

0. MFC에서는 각 UI Component는 멤버변수를 추가해서 처리하는 것이 훨씬 간편하다

방법은 리소스 편집기에서 멤버변수 추가를 원하는 컴포넌트를 클릭후에 우클릭을 하면 메뉴가 나온다

이 메뉴에서 "Add Variable / 변수 추가하기"를 선택하면 마법사가 나온다.

마법사에서 멤버 변수명을 추가하고 "Finish/종료"를 선택하면 된다.


1. LISTBOX Tips

a. ListBox에 CString을 추가하기

AddString으로 넣을 경우에 UI 갱신 타이밍에 따라서 순서가 엉킬수가 있다.,

그러므로 Insert(인덱스, CString 객체)가 순서에 훨씬 명시적이다.


2. CEDIT Tips

b. CEDIT 컴포넌트에서의 Text 를 Get/Set하기

길이 - m_edit_fwversion.GetWindowTextLengthW()

Get - m_edit_fwversion.GetWindowTextW(m_fw_ver); // 선언한 CString 객체로 해당 값이 들어온다,

Set - m_admin_password.SetWindowTextW(_T("what you want")); //입력된 문자열이 바로 표시된다.

글자수 제한 - m_edit_sn_date.SetLimitText(3);

숫자만 입력 - 리소스 편집기에서 "Number" 라는 속성(property)를 true를 하면 숫자만 입력받게 할수 있다.

비밀번호 창으로 쓸 때 - "Password"라는 속성을 "true"로 해주면 입력 값이 "*"로 보이게 할 수 있다.


3. COMBOBOX Tips

a. 콤보박스에서 정해진 값만 보여주고 선택한 콤보아이템을 편집하지 못하게 할때

콤보박스 속성에 "Type" 중에 "Dropdownlist"를 선택할 경우에 정해진 아이템만 선택하고 편집이 불가능하게 할 수 있다.


b. 콥보박스에서 선택된 셀의 Text를 읽어오기.

GetLBText를 사용하면 해당 콤보박스의 아이템 텍스트를 바로 가져올 수 있고 형식은 CString이다.

ex. m_cb_sn_group1.GetLBText(m_cb_sn_group1.GetCurSel(),set_p_group1);




by 무위자연 2015. 2. 12. 12:09
| 1 |