클립보드에 문자열을 저장하는 팁입니다.

 

OpenClipboard 로 클립보드를 오픈하고 SetClipboardData 함수로 클립보드에 문자열을 저장합니다.

 

BOOL CUtility::SetClipBoardString(CString data)

{

 

           if ( !OpenClipboard(NULL) )

           {

                     m_errMessage = L"Cannot open the Clipboard";

                     return FALSE;

           }

          

           if( !EmptyClipboard() )

           {

                     m_errMessage = _T("Cannot empty the Clipboard");

                     return FALSE;

           }

          

           wchar_t *wcBuffer = 0;

           HGLOBAL hglbCopy = GlobalAlloc( GMEM_MOVEABLE, ( data.GetLength() + 1 ) * sizeof (wchar_t) );

           wcBuffer = ( wchar_t* )GlobalLock( hglbCopy );

           wcscpy( wcBuffer,  data );

 

           GlobalUnlock( hglbCopy ); 

          

           if ( ::SetClipboardData( CF_UNICODETEXT, hglbCopy ) == NULL )

           {

                     m_errMessage.Format(L"Unable to set Clipboard data, error: %d", GetLastError());

                     CloseClipboard();           

                     return FALSE;

           }

           CloseClipboard();

           return TRUE;

 

 

 

dll 파일의 경로로  해당 파일의 버전을 가져오는 팁입다.

 

CString CUtility::GetDllVersion()

{

           TCHAR  path[MAX_PATH] = {0};

           GetModuleFileName(AfxGetStaticModuleState()->m_hCurrentInstanceHandle, path, MAX_PATH);

          

           DWORD infoSize = 0;

           CString ver;

 

     // 파일로부터 버전정보데이터의 크기가 얼마인지를 구합니다.

            infoSize = GetFileVersionInfoSize(path, 0);

            if(infoSize==0) return L"";

          

           // 버퍼할당

           char* buffer = NULL;

    buffer = new char[infoSize];

    if(buffer)

    {

          // 버전정보데이터를 가져옵니다.

          if(GetFileVersionInfo(path,0,infoSize, buffer)!=0)

          {

                VS_FIXEDFILEINFO* pFineInfo = NULL;

                UINT bufLen = 0;

               // buffer로 부터 VS_FIXEDFILEINFO 정보를 가져옵니다.

               if(VerQueryValue(buffer, L"\\",(LPVOID*)&pFineInfo, &bufLen) !=0)

               {   

                    WORD majorVer, minorVer, buildNum, revisionNum;

                    majorVer = HIWORD(pFineInfo->dwFileVersionMS);

                    minorVer = LOWORD(pFineInfo->dwFileVersionMS);

                    buildNum = HIWORD(pFineInfo->dwFileVersionLS);

                    revisionNum = LOWORD(pFineInfo->dwFileVersionLS);

 

                    // 파일버전 출력

                                                     ver.Format(L"%d.%d.%d.%d", majorVer, minorVer, buildNum, revisionNum);

                    //printf("version : %d,%d,%d,%d\n",majorVer, minorVer, buildNum, revisionNum);

                }

           }

          delete[] buffer;

      } 

           return ver;

}

 

자바스크립트의 Split 함수와 동일한 역할을 하는 MFC의 CString을 CStringArray을 변환하는 팁입니다.

 

 

CString str = L"AAA*??*BBB*??*CCCC";

CStringArray itemInfors;
 m_Utility.SpliteArray(str,  L"*??*", itemInfors);

 

void CUtility::SpliteArray(CString strData, CString Seperator, CStringArray& arr)

{

           CStringArray datas;

           CString Sep = Seperator;

           CString data = strData;

           int Position = 0;

           CString Token;

                    

           Token = data.Tokenize(Seperator, Position);

           if( Token != L"") arr.Add(Token);

 

           while(!Token.IsEmpty())

           {

                     // Get next token.

                     Token = data.Tokenize(Seperator, Position);

                     if(Token != L"")

                     {

                                arr.Add(Token);

                     }                                         

           }

}

 

 

PC내의 유선 또는 무선 네트워크 어댑터로부터 모든 Mac Address를 가져오는 샘플입니다.

 

간단하게 MFC의 CStringArray에 어드레스를 할당하는데, 적당히 활용하면 될 것으로 보입니다.

void CUtility::GetMacAddress(CStringArray& addresss)

{

           IP_ADAPTER_INFO AdapterInfo[16];        

           DWORD dwBufLen = sizeof (AdapterInfo); 

 

           DWORD dwStatus = GetAdaptersInfo(AdapterInfo, &dwBufLen);             

          if (dwStatus == NO_ERROR)

           {

                     PIP_ADAPTER_INFO pAdapterInfo = AdapterInfo; 

                    while (pAdapterInfo)

                     {

                                CStringA strMacAddress;

                                strMacAddress.Format("%02X:%02X:%02X:%02X:%02X:%02X",

                pAdapterInfo->Address[0],

                pAdapterInfo->Address[1],

                pAdapterInfo->Address[2],

                pAdapterInfo->Address[3],

                                    pAdapterInfo->Address[4],

                pAdapterInfo->Address[5]); 

                                addresss.Add(CA2T(strMacAddress));

                                pAdapterInfo = pAdapterInfo->Next;    // 다으 링크

                     }                           

           }

}

 

리스트 컨트롤의 SetExtendedStyle 함수에 LVS_EX_FULLROWSELECT 옵션만 주면 됩니다.

 

CListCtrl m_ctlList;

......

m_ctlList.SetExtendedStyle(LVS_EX_FULLROWSELECT);

 

 

 

 

 

 

 

 

 

 

싸이코 패스 테스트

[일상] Sudean Story 2015.01.16 17:36 Posted by Sudean(수딘)

재미(?)삼아 해 보세요.

 

그러기엔은 좀 무서워요.

 

먼저 질문을 풀어보고 나중에 해석을 보세요~~~`

 

 

사이코패스 질문.docx

 

사이코패스 해석.docx

 

 

'[일상] Sudean Story' 카테고리의 다른 글

싸이코 패스 테스트  (0) 2015.01.16
3000년 마다 한번 핀다는 우담바라  (0) 2010.08.25

 

 

GetLastError()  함수로 리턴된 에러코드로 실제 에러 메시지를 가져오는 샘플입니다.

MFC 함수로 만든건데 걍 C++ 코드는 적당히 수정해서 ㅋㅋ

 

CString CUtility::ConvertGetLastError(DWORD dwError)

{         

           CString errMsg;

           DWORD result = ::GetLastError();

           WCHAR buf[256] = {0};

           FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, dwError, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);

           errMsg = buf;

           return errMsg;

}

 

 

 

 

 1. 멀티 바이트를 유니코드(Wide Char)로 변환

 

// MBCS을 와이트 케릭터(UTF-8)으로  변경한다.
STDAPI_(WCHAR*) gf_ConvertWBCS(char* mbcs, ULONG size);

 

STDAPI_(WCHAR*) gf_ConvertWBCS(char* mbcs, ULONG size)

{

           long lSize=MultiByteToWideChar( CP_UTF8, 0, (LPSTR)mbcs, -1, NULL, 0);

           LPTSTR lpBuffer = (LPTSTR)new WCHAR[size + 1];

           wmemset(lpBuffer, 0, size + 1);

           MultiByteToWideChar(CP_UTF8, 0, (LPSTR)mbcs, -1, lpBuffer, size);

           return lpBuffer; 

}

 

char* mbcs = NULL;
WCHAR* wbcs = NULL;

mbcs = (char*)malloc(length+1);  
ZeroMemory(mbcs, length+1);

sprintf(mbcs, "%.*s", length, (char*)xml3);
wbcs = gf_ConvertWBCS(mbcs, length); 


if( wbcs != NULL)
{
    free(wbcs);
}

 

2.유니코드를 멀티바이트로 변환

 

// 와이드 문자열을 멀티바이트로 변환한다.
STDAPI_(char*) gf_ConvertMBWS(WCHAR* wbcs, ULONG type);

 

STDAPI_(char*) gf_ConvertMBWS(WCHAR* wbcs, ULONG type )

{

           //유니코드에서 멀티바이트로 변환 방법

   // newVal이란 BSTR 타입에 있는 유니코드 문자열을 sTime이라는 ANSI 문자열로 변환        

           char* pTemp = NULL;

           int iLen = ::WideCharToMultiByte(type, 0, wbcs, -1, pTemp, 0, NULL, NULL);

           pTemp = new char[iLen+1];

           memset(pTemp, 0, iLen+1);         

           ::WideCharToMultiByte(type, 0, wbcs, -1, pTemp, iLen, NULL, NULL);

           return pTemp;  

}

 

WCHAR pszStr1[MAX_PATH_EX] = {0};

 StringCchCopy(pszStr1, MAX_PATH_EX, str1);

 

char* pStr1 =gf_ConvertMBWS(pszStr1, CP_ACP);

if(pStr1!=NULL) delete pStr1;

 

 

 

 

 

 

 

64 bit Winodws OS Check

[Native] C/C++/ATL/[C/C++, ATL] Dev Tips 2015.01.14 11:06 Posted by Sudean(수딘)

WINDOWS OS가 x64 인지 아닌지 체크하는 방법입니다.

 

typedef void (WINAPI *PGNSI)(LPSYSTEM_INFO); 

 

BOOL CSPDocLibProgressDlg::IsWow64() 

{

           SYSTEM_INFO sysInfo;

           ZeroMemory( &Info, sizeof(SYSTEM_INFO) );

           PGNSI pGetNativeSystemInfo = (PGNSI)GetProcAddress(GetModuleHandle( _T("kernel32.dll") ), "GetNativeSystemInfo");

           if( pGetNativeSystemInfo != NULL )

           {

                     pGetNativeSystemInfo( & sysInfo);

           }

           else

           {

                     GetSystemInfo( & sysInfo);

           }

           if(sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64 )

           {                    

                     return TRUE;

           }

           else if(sysInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_INTEL )

           {          

                     return FALSE;

           }

           //ASSERT( FALSE ); // something went majorly wrong

           return FALSE;

}

 

자격 증명 관리자에 계정을 등록해서 NTLM 이 필요한 사이트를 자동 로그인  시킬 수 있습니다.

 

단, 브라우저에서 해당영역의 사용자 인증이 "인트라넷 영역에서만 자동으로 로그온" 또는 "현재 사용자 이름 및 암호를 사용하여 자동으로 로그온" 으로 설정되어 있어야 합니다.

 

 

 

 

CredRead 함수는 자격증명 관리자에 해당 호스트가 있는지 확인합니다.

CredDelete 함수는 자격 증명 관리자에서 해당 호스트를 삭제합니다.

CredWrite 함수는 자격증명 관리자에 호스트를 등록합니다.

 

 

헤더 파일을 추가합니다.

#include <WinCred.h>

 

1) 계정 읽기 ( CredRead )

BOOL CUtility::ReadCredential()

{         

           BOOL bOk;

           WCHAR szServer[MAX_URL] = {0};

           WCHAR szDomain[MAX_NAME] = {0};

           WCHAR szId[MAX_NAME] = {0};

           WCHAR lpszPassword[MAX_NAME] = {0};

 

           LoadAccount(szServer,szDomain, szId, lpszPassword);

 

           WCHAR HostName[1000] = {0};  

           wcscpy(szHost, L"xxx.sharepoint.com");

           PCREDENTIAL pcred;      

          bOk = ::CredRead(szHost,  CRED_TYPE_DOMAIN_PASSWORD, 0,  &pcred);     

           if( bOk)  // 계정이 존재하면 TRUE을 리턴한다.

           {

                 ::CredFree(pcred);

           }           

           return bOk;

}

 

 

 

2) 계정 추가  (CredWrite)

BOOL CTipUtility::AddCredential2(CString& error)
    

 BOOL bOk;

 WCHAR szHost[MAX_URL] = {0};
 WCHAR szDomain[MAX_NAME] = {0};
 WCHAR szId[MAX_NAME] = {0};
 WCHAR lpszPassword[MAX_NAME] = {0};

 LoadAccount(szServer,szDomain, szId, lpszPassword);

 

 TCHAR   pzAccout[MAX_PATH] = {0};   

 

 CString account;
 account.AppendFormat(L"%s\\%s", szDomain, szId);  
 wcscpy(pzAccout, account);

 wcscpy(szHost, L"xxx.sharepoint.com");

 

 CREDENTIAL cred = {0};
 cred.Type = CRED_TYPE_DOMAIN_PASSWORD;
 cred.TargetName = HostName;
 cred.CredentialBlobSize = (DWORD)wcslen(lpszPassword) * sizeof(WCHAR);
 cred.CredentialBlob = (LPBYTE)lpszPassword;
 cred.Persist = CRED_PERSIST_ENTERPRISE;
 cred.UserName = pzAccout;
 bOk = ::CredWrite(&cred, 0);

 if(!bOk)  
 {
      DWORD result = ::GetLastError(); 
      WCHAR buf[256];
      FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result,

    MAKELANGID  (LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);

error = buf;


 return bOk;

}

 

 

3) 계정 삭제 (CredDelete)

BOOL CTipUtility::DeleteCredential2(CString& error)
{
       BOOL bOk;

 WCHAR szServer[MAX_URL] = {0};
 WCHAR szDomain[MAX_NAME] = {0};
 WCHAR szId[MAX_NAME] = {0};
 WCHAR lpszPassword[MAX_NAME] = {0};

 LoadAccount(szServer,szDomain, szId, lpszPassword);

 

 TCHAR   HostName[1000] = {0};

 wcscpy(szHost, L"xxx.sharepoint.com");

 

 bOk = CredDelete(szHost, CRED_TYPE_DOMAIN_PASSWORD, 0);

 if(!bOk)  
 {


  DWORD result = ::GetLastError();
  WCHAR buf[256];
  FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, NULL, result, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), buf, 256, NULL);
  error = buf;


 }

 return bOk;


}