암호화라고 거창하게 써놨지만, 사실 별거 없죠

걍 특정/불특정 문자열을 꼬아놓은다 랄까...

여튼, 전 제가 원하는 임의의 문자(숫자)를 곱하는 형식을 취했습니다.


CFile f;

 CFileException e;
 
 CString fileName, strHost;
 
 UpdateData(TRUE);
 
 char *p_host = (LPSTR)(LPCSTR)m_strHost; // 에디트 박스에 쳐박은 호스트주소입니다.
 
 char key = 243;
 
 int i = 0;
 
 for( i = 0; i < strlen(p_host); i++){  // 한글자 마다 key 값을 곱합니다 (-_-) 제곱이랄까....
  p_host[i] = p_host[i] ^ key;
 }

 strHost.Format("%s\r\n", p_host);
 
 char szCurDir[256] = {NULL, };

 GetCurrentDirectory(256, szCurDir);
 strcat(szCurDir, "\\config.ini");
 fileName=szCurDir;

 if( !f.Open( fileName, CFile::modeCreate | CFile::modeWrite, &e ) )
 {
#ifdef _DEBUG
  afxDump << "File could not be opened " << e.m_cause << "\n";
#endif
 }
 else
 {
  f.SeekToEnd();
  f.Write(strHost , strlen(strHost)); // 저장합니다.
  f.Close();
 }

끝.

읽어올때도 마찬가지로 하나씩 읽어오는 형태를 취합니다.


 char szCurDir[256] = {NULL, };
 CString fileName, strHost;
 GetCurrentDirectory(256, szCurDir);
 strcat(szCurDir, "\\config.ini");
 fileName=szCurDir;
 char load_data[256] = { 0 ,};
 char key = 243;
 int i = 0;
 
 FILE *p_file = fopen(fileName, "rb");
 if(p_file != NULL){
  fread(load_data, 256, 1, p_file);
  fclose(p_file);
 }
 
 int length = strlen(load_data);
 int j = 0, k=0;
 
 for(i = 0; i < length; i++){
  load_data[i] = load_data[i] ^ key;
 }
 m_strHost = load_data;
 if(bUpdate) UpdateData(FALSE);

끝...

by PrettyNaru 2009.09.21 15:53

Static컨트롤에 색상을 입히는 것 까지는 좋으나, 다이얼로그를 계속 생성하거나

폰트사이즈를 지정해줄 경우, 1회성으론 관계가 없다.

하지만, 여러번 다이얼로그를 불러온다던가 하면서

SetFontSize 메소드를 계속 불러올 경우

에러를 토해내는데, 생각보다 단순한 문제였다.

우선, ColotStaticST의 함수 부분을 살펴보면

void CColorStaticST::SetFontSize(int nHeight, int nWidth, BOOL bold)
{
 CFont* pFont  = NULL;
 LOGFONT LogFont;

 pFont   = GetFont();
 pFont->GetLogFont(&LogFont);

 if(nHeight > 0)
 {
  LogFont.lfHeight = nHeight;
 }

 if(nWidth > 0)
 {
  LogFont.lfWidth  = nWidth;
 }
 
 if(bold)
 {
  LogFont.lfWeight = FW_BOLD;
 }

 m_pFont->CreateFontIndirect(&LogFont);

 SetFont(m_pFont);

 Invalidate();
}

자 무엇이 문제인지 알겠는가.

 m_pFont->CreateFontIndirect(&LogFont);

이부분에서 에러가 발생하게 된다.

즉, 반복적으로 불러올 경우, 불러오는 만큼 오브젝트를 계속 생성하려 들기 때문인데

여러가지 해결 방법이 있을 수 있겠지만 본인은 이렇게 해결했다. (사실 좀 무식하게 해결한..)

m_cStStatus.m_pFont->DeleteObject();

해당 컨트롤에 대한 변수를 선언하고 (CColorStaticST m_cStStatus; 등..)

CColorStaticST가 가지고 있는 멤버변수인 m_pFont 에 직접 DeleteObject() 를 수행케 함으로써 해결했다.

.... 아 쓰고나니 진짜 개무식하네-_-

by PrettyNaru 2009.09.18 09:47

파일에 쓸때:

 - 형식:
WritePrivateProfileStringA(
    LPCWSTR lpAppName,
    LPCWSTR lpKeyName,
    LPCWSTR lpString,
    LPCWSTR lpFileName
    );

 - 사용법:
  WritePrivateProfileString("카테고리", "파라메터", 저장하고자하는항목(변수), ini파일의 위치);

실 사용 예:
  char szCurDir[256] = {NULL, };
  int port;
  CString strPort;
  GetCurrentDirectory(256, szCurDir);
  strcat(szCurDir, "\\server.ini");
  strPort.Format("%d", port);
  WritePrivateProfileString("Server", "Port", m_nPort, szCurDir);
  strMsg.Format("%d", size);


파일로부터 읽어올때:

 - 형식:
GetPrivateProfileStringA(
    LPCSTR lpAppName,
    LPCSTR lpKeyName,
    LPCSTR lpDefault,
    LPSTR lpReturnedString,
    DWORD nSize,
    LPCSTR lpFileName
    );

 - 사용법:
 GetPrivateProfileString("카테고리", "파라메터", "기본값", 저장할곳, 읽어올바이트수, ini파일의 위치);

실 사용 예:

 CString strButt;
 int port, m_nPort;
 char szBuffer[256] = {NULL , };
 char szCurDir[256] = {NULL, };
 GetCurrentDirectory(256, szCurDir);
 strcat(szCurDir, "\\server.ini");
 GetPrivateProfileString("Server", "Port", "15000", szBuffer, 256, szCurDir);
 strBuff.Format("%s", szBuffer);
 port = atoi(szBuffer);
 m_nPort.Format("%d", port);

by PrettyNaru 2009.09.14 10:04

BOOL C다이얼로그클래스::PreTranslateMessage(MSG* pMsg)
{
 if (pMsg->message==WM_MOUSEMOVE)
    {
        if (GetDlgItem(IDC_SEND)->GetSafeHwnd()==pMsg->hwnd)
        {

        }
        else if (GetDlgItem(IDC_SELSEND)->GetSafeHwnd()==pMsg->hwnd)
        {
   
        }
        else if (GetDlgItem(IDC_START)->GetSafeHwnd()==pMsg->hwnd)
        {
   
        }
        else if (GetDlgItem(IDOK)->GetSafeHwnd()==pMsg->hwnd)
        {
   
         }
      }
   return CDialog::PreTranslateMessage(pMsg);
}

....

사실 버튼같은 경우엔 CButtonST를, 스태틱컨트롤은 CColorStaticST를 쓰는 편이 낫긴 하다.

by PrettyNaru 2009.09.14 09:47

같은 내용의 MFC프로그램을 ARM용으로 하나의 eVC 4.0 프로젝트를 생성하고
Win32용으로 하나의 VS 6.0 프로젝트를 생성해서 두개를 관리해왔습니다.

뭐 하나로 묶어서 쓸 수도 있었겠지만, 난 초보니까.

헌데 이번에 2005를 쓰다보니, 이걸 하나로 뭉칠 수 있을 것 같았습니다.
그래서 뭉쳤죠 (-_-)

지난번 글에도 언급했다 시피 어차피 임베디드계열과 Win32를 병행한다면
eVC로 만든것을 컨버팅하는게 낫다고 생각합니다.

왜?

1>C:\Program Files\Microsoft Visual Studio 8\VC\ce\include\crtdefs.h(100) : fatal error C1189: #error :  ERROR: Use of C runtime library internal header file.
1>Build log was saved at "file://c8c8c8c8c8c8c8c8c8 (ARMV4I)\Debug\BuildLog.htm"
1>zip_dev - 1 error(s), 1 warning(s)
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

이딴에러 만날 일 없거든... -_-


여튼, 각설하고

eVC를 컨버팅 해서 쓰려고 하니, 컴파일시 다음과 같은 문제가 발생을 합니다.

warning C4996: 'strcpy' was declared deprecated
        c:\program files\microsoft visual studio 8\vc\include\string.h(73) : see declaration of 'strcpy'
        Message: 'This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_DEPRECATE. See online help for details.'

... WHAT THE FUCK??
기본 API에서 오류가 날리가 없잖아... 근데 났네요

이는 stdafx.h 상단에
 #define _CRT_SECURE_NO_DEPRECATE
를 정의함으로써 해결가능합니다.

또, rc2 파일인가 rc파일이 없다고 컴파일이 안되는 부분도 생기는데
전 그냥 주석처리 해버렸습니다 (무식한놈....)

by PrettyNaru 2009.08.11 15:36

기존엔 WinCE 5.0기준으로 개발해왔기 때문에

개발환경을 VS6.0 과 eVC++ 4.0 을 쓰다가

이제 WinCE 6.0 을 개발해야 하는 상황이 와서

SDK가 VS 2005 에서만 구동되는 x같은 상황이 왔습니다.


그래서 Visual Studio 2005를 사용중에 있는데.

확연히 다르다는 느낌도 많이 받거니와

확실히 짜증도 많이 납니다.


기존 VS 6.0 -> VS 2005 로 컨버팅 해서 쓰느니

eVC++ 4.0 -> VS 2005 로 컨버팅 해서 쓰는게 낫다는 생각도 들고요.
(물론 어디까지나 임베디드 개발도 병행해야 할 경우의 이야기입니다.)

조만간에 개발노트들을 마구마구 작성할 듯 싶습니다.

by PrettyNaru 2009.08.11 15:26
| 1 |