1. 버추얼박스(VirtualBox) 컨트롤러 에서 공유 폴더 설정

2. 버추얼박스의 윈도우7 내컴퓨터에서 메뉴>도구>네트워크 드라이브 연결

3. \\vBoxSrv\[공유폴더 이름]

 - [공유폴더 이름] : 버추얼박스에서 공유 폴더 설정할때 생성된 이름임

블로그 이미지

요다할아범

,

[Tips] Win32 콘솔 애플리케이션에서 MFC class들을 사용하기

  5 Comments

이미 잘 알려진 내용이지만 제 블로그의 검색을 위해 짧게 포스팅합니다.

Visual Studio 6.0에서 Win32 콘솔 애플리케이션 (Console Application)으로 프로젝트를 만들어 표준 C/C++ 라이브러리를 이용할 때 MFC (Microsoft Foundation Class Library)의 클래스들 (e.g. CString, CObList)을 이용하는 방법입니다.

1. CRT (C Run-Time) library를 Multithreaded로 변경

  1. Alt+F7을 누르거나 메뉴의 Project / Setting을 선택해서 “Project Settings” 창을 띄웁니다.
  2. “C/C++” 탭에서 “Category”를 “Code Generation”이라고 선택합니다.
  3. 아래 그림과 같이 “Use run-time library”를 “Debug Multithreaded”로 변경합니다. 
    ※ 물론 릴리즈 모드인 경우는 Multithreaded를 선택하겠죠.

MFC 클래스를 위한 헤더 파일들을 포함시켜도 링크 에러가 나는 것은 Win32 console application 프로젝트는 기본적으로 “Single-Threaded” CRT library를 사용해서 멀티스레드를 위한 api 구현이 없기 때문입니다. 그래서 이와 같이 CRT 라이브러리를 변경하는 것입니다.

2. 필요한 헤더 파일 포함

사용할 MFC 클래스를 정의하고 있는 헤더 파일들을 포함합니다.

※ MFC의 헤더 파일과 라이브러리 설명은 Devpia의 이 글을 참고하시면 됩니다.

간단히 많은 것을 포함하는 헤더 파일들만 설명드리면..

Afx.h: MFC를 위한 main header file로 컨테이너를 비롯한 많은 MFC 클래스들을 선언합니다.

Afxtempl.h: CArray등 템플릿을 요하는 클래스들의 선언을 가지고 있습니다.

간단히 CString이나 CObList를 사용하는 경우는 Afx.h를 포함하면 될 것이고

CArry, CList등 템플릿 컨테이너 클래스를 사용할 경우는 Afxtempl.h를 포함하면됩니다.

순서는 Afx.h가 먼저 오는 것이 좋겠죠? (순서가 바뀌어도 컴파일 에러는 나지 않으나…)

// MFC main header file. for CString, CObList, etc
#include <afx.h>

// MFC template based container class. for CArray, CList, etc
#include <afxtempl.h>
#include <iostream>

void main()
{
CString str;
CObList list;
CArray<CString, CString> ar;
str.Format(“test CString: %s”, “temp string”);
std::cout<<(LPCSTR)str<<std::endl;
}


블로그 이미지

요다할아범

,

컨테이너 간의 복사는 자료형이 다르더라도 카피 알고리즘에 의하여 호환성을 지닌다. 
주의할 점은 덮의 씌워지는 대상의 객체의 사이즈가 원본컨테이너의 사이즈보다 같거나 커야한다. 
copy알고리즘을 사용하기전에 resize명령어로 컨테이너의 사이즈를 꼭 재조정 하도록 한다.

다음예제는 컨테이너와 컨테이너간에 값을 덮어 씌우는 방법이다.(추가가 아님!)

#include "stdafx.h"

#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 list<int> a1;
 vector<int> a2;

 for(int i = 0; i < 10; ++i)
  a1.push_back(i);
 
 a2.resize(a1.size());
 copy(a1.begin(), a1.end(), a2.begin());

 deque<int> a3(a1.size());
 copy(a1.begin(), a1.end(), a3.begin());

 for(int i = 0; i < 10; ++i)
  cout << a2[i] << ' ' << a3[i] << ' ';

 cout << endl;
 return 0;
}


다음 예제는 컨테이너에 반복자 어댑터를 사용하여 새로운 원소를 추가하는 방법이다.
미리 정의된 삽입 반복자에는 3가지가 있다
back_inserter(container) - push_back()을 사용하여 뒷부분에 추가시킨다
front_inserter(container) - push_front()를 사용하여 앞부분에 추가시킨다
inserter(container, pos) - insert()를 사용하여 pos위치에 삽입한다.

#include "stdafx.h"

#include <iostream>
#include <list>
#include <vector>
#include <deque>
#include <set>
#include <algorithm>
using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
 list<int> a1;

 for(int i = 0; i < 10; ++i)
  a1.push_back(i);

 //a1의 모든 원소들을 a2에 뒷부분으로 추가한다.
 vector<int> a2;
 copy(a1.begin(), a1.end(), back_inserter(a2));

 //a1의 모든 원소들을 a3에 앞부분으로 추가한다.
 deque<int> a3;
 copy(a1.begin(), a1.end(), front_inserter(a3));

 //a1의 원소들을 a4에 복사한다.
 //연관 컨테이너는 오직 inserter()와만 동작한다.
 set<int> a4;
 copy(a1.begin(), a1.end(), inserter(a4.begin());
 return 0;
}

블로그 이미지

요다할아범

,

/*

std::list<CUser *> l1;

std::vector<CUser *> v1;


for( nSeed = 0; nSeed < MAX_SEED; nSeed++ )

{

l1.assign( m_QueUser[ nSeed ].GetListInactive()->GetList()->begin(), m_QueUser[ nSeed ].GetListInactive()->GetList()->end() );

v1.resize( l1.size() );

std::copy( l1.begin(), l1.end(), v1.begin() );

for( INT8 n = 0; n < RAND(v1.size()); n++ )

std::random_shuffle( v1.begin(), v1.end() );


std::list<CUser *> l2(v1.begin(), v1.end()); // 다른 방법: std::copy(v1.begin(), v1.end(), std::inserter(l1, l1.begin()));

m_QueUser[ nSeed ].GetListInactive()->GetList()->clear();

m_QueUser[ nSeed ].GetListInactive()->GetList()->assign( l2.begin(), l2.end() );

l1.clear();

l2.clear();

v1.clear();

}

//*/


//////////////////////////////////////////////////////////////////////////

// INT8 i;

// TRACE("==START=================================================================================\n" );

// for( i = 0; i < 1; i++ )

// {

// CSync Sync( m_QueUser[ i ].GetListInactive()->GetSync() );

// CSyncList<CUser>::SYNC_POSITION pos = m_QueUser[ i ].GetListInactive()->GetHeadPosition();

// while( !m_QueUser[ i ].GetListInactive()->IsEnd( pos ) )

// {

// CUser *pUser = m_QueUser[ i ].GetListInactive()->GetItem( pos++ );

// if( pUser )

// {

// TRACE(" %s\n", pUser->m_szUserID );

// }

// }

// }

// 

// TRACE("==std::list=================================================================================\n" );

// std::list<CUser *> l1;

// l1.assign( m_QueUser[ 0 ].GetListInactive()->GetList()->begin(), m_QueUser[ 0 ].GetListInactive()->GetList()->end() );

// std::list<CUser *>::iterator iterEnd = l1.end();

// for( std::list<CUser *>::iterator iterPos = l1.begin(); iterPos != iterEnd; ++iterPos )

// {

// CUser *pUser = *iterPos;

// if( pUser )

// {

// TRACE(" %s\n", pUser->m_szUserID );

// }

// }

// 

// TRACE("==std::vector=&=std::vector:random_shuffle()====================================================\n" );

// std::vector<CUser *> v1;

// v1.resize( l1.size() );

// std::copy( l1.begin(), l1.end(), v1.begin() );

// for( INT8 n = 0; n < RAND(v1.size()); n++ )

// std::random_shuffle( v1.begin(), v1.end() );

//

// std::vector<CUser *>::iterator vEnd = v1.end();

// for( std::vector<CUser *>::iterator vPos = v1.begin(); vPos != v1.end(); ++vPos )

// {

// CUser *pUser = *vPos;

// if( pUser )

// {

// TRACE(" %s\n", pUser->m_szUserID );

// }

// }

// 

// TRACE("==END=================================================================================\n" );

// std::list<CUser *> l2(v1.begin(), v1.end()); // 다른 방법: std::copy(v1.begin(), v1.end(), std::inserter(l1, l1.begin()));

//

// m_QueUser[ 0 ].GetListInactive()->GetList()->clear();

// m_QueUser[ 0 ].GetListInactive()->GetList()->assign( l2.begin(), l2.end() );

// 

// for( i = 0; i < 1; i++ )

// {

// CSync Sync( m_QueUser[ i ].GetListInactive()->GetSync() );

// CSyncList<CUser>::SYNC_POSITION pos = m_QueUser[ i ].GetListInactive()->GetHeadPosition();

// while( !m_QueUser[ i ].GetListInactive()->IsEnd( pos ) )

// {

// CUser *pUser = m_QueUser[ i ].GetListInactive()->GetItem( pos++ );

// if( pUser )

// {

// TRACE(" %s\n", pUser->m_szUserID );

// }

// }

// }

// 

// l1.clear();

// l2.clear();

// v1.clear();

//////////////////////////////////////////////////////////////////////////

블로그 이미지

요다할아범

,

오라클 데이터베이스(Oracle Database) 11g 삭제하기

 

   1. 내컴퓨터 (우클릭) -> 관리 -> 서비스 및 응용프로그램 -> 서비스 -> Oracle 로 시작하는 모든 프로그램 중지

  

2. 시작->실행->regedit 적고-> 레지스트리 편집기에서 아래 레지를 지우기 

아래 폴더 안에 해당 레지가 존재하지 않는다면 무시

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE
HKEY_LOCAL_MACHINE\SOFTWARE\ODBC
HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services 
에서 Oracle이라 시작하는 모든  삭제

HKEY_LOCAL_MACHINE\SYSTEM\ControlSet002\Services 
에서 Oracle이라 시작하는 모든  삭제
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\ 
에서 Oracle이라 시작하는 모든 

 

3. 내컴퓨터 (우클릭) -> 속성 -> 고급시스템설정 ->고급 -> 환경변수 -> 시스템 변수 아래에 있는 Path 편집

변수값에서 D:\app\product\11.2.0\dbhome_1\bin (사용자 컴퓨터에 따라 다를 수 있음)라 되어있는 내 DBhome bin 변수값을 삭제

 

4. C드라이브 -> Program files -> Oracle -> inventory 삭제

Oracle 폴더안에 inventory만 있다면 Oracle 폴더 전체 삭제

 

5. DB 폴더 삭제

만약 DB폴더가 D드라이버에 있는 app폴더에 저장되어 있으면이 폴더 전체를 삭제

 

블로그 이미지

요다할아범

,