분류 전체보기 (199)
ººº::Development™:: (66)
ººº::Learning™:: (31)
ººº::Information™:: (37)
ººº::Note™:: (11)
ººº::Photo™:: (50)
ººº::zEtc™:: (3)
rss

믹시
tistory 티스토리 가입하기!
'c'에 해당되는 글 6건
2008. 12. 4. 21:27
입력된 path를 바탕으로 폴더를 만들어 주는 코드.
어찌보면 상당히 간단하다고 생각할 수 있지만, 나같이 C/C++코드를 잘 모르는 사람들에게는 어찌 느껴질지 모르는 코드이다. 자랑두 아닌 챙피하지만, 주로 JAVA로 개발을 해오다 보니 C/C++은 전혀 꽝이었다는... 그러다보니 이런 간단한 코드조차 사람을 당황스럽게 만들 수 있다는 사실.ㅋㅋ 오랫동안 머릿속에 남기기 위해!..

std::string strDirPath;
std::string strTempDir;
int indexOf = 0;
while( true ) {
indexOf = strDirPath.find( "/" );
strTempDir += strDirPath.substr( 0, indexOf ) + "/";

mkdir( strTempDir.c_str(), 0777 );
strDirPath = strDirPath.substr( indexOf + 1, strDirPath.length() );

if( indexOf < 0 ) break;
}

위 코드는 아주 간단하다 생성하고자 하는 PATH에서 "/"문자를 찾아 한 단계씩 폴더를 생성하는 것이다. 위 코드에 보면 폴더가 있는지 유무를 Check하고 하는 디테일한 부분은 존재하지 않는다. 그냥 기본적인 생각만 가지고 있는 코드이다.

:: 그럼 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복한 하루 되시길 ::



2008. 12. 3. 09:13
프로그램을 작성하다 보면 간단한 로직이라도 생각이 안날경우가 있다. 내가 바로 그 경우로 아주 쉽게 너무 자주 이런 현상이 발생한다. 지금 내가 쓰고자 하는 포스트도 같은 맹락에서 작성하는 것이다.
C나 C++로 코드를 작성하는 가운데 오늘 날짜를 구해야 하는 경우가 있는데 이럴 경우 어떻게 할까? 순간적으로 코드가 생각이 안나서 이렇게라도 글로 남겨 놓는다.

struct tm*    datetime;
time_t    t;
t = time( NULL );
datetime    = localtime( &t );

printf( "%d/%02/%02d %02d:%02d:%02d", datetime->tm_year - 1900,
 datetime->tm_mon + 1,
datetime->tm_mday,
datetime->tm_hour,
datetime->tm_min,
datetime->tm_sec );

코드는 아주 간단하다. 위와 같은 형식으로 작성해 주면 되고, 년/월/일 시:분:초 형식으로 사용하면 된다.

:: 이 글을 읽는 모든 분들에게 오늘 하루 즐겁고 행복한 하루 되길 ::



2008. 11. 6. 09:04
기존 솔루션을 Java에서 C++로 바꾸는 프로젝트가 진행중이다. 기존에는 Java를 사용하기 때문에 공개된 API를 가져다 사용하기 편했지만, C++로 넘어오면서는 내가 많이 사용해보지 않은 플랫폼으로 인해 라이브러리 하나 사용하기도 쉽지가 않다. 그러다가 XML을 사용하기 위해 apache xercex-c 사용이 정해진 이후 해당 라이브러리를 사용하기 위해 삽질한 흔적을 나겨본다.

xercex-c 사용을 위해 지금 현재 개발 환경을 간략하게 살펴보면, Fedora8에서 Eclipse에서 C++코딩을 하고 있다. 기본적인 Charset은 UTF-8을 사용하고 있다.

우선 xercex-c사용을 위해 해당 라이브러리르 설치하자, 설치는 간단하게 yum을 통한 install소스코드를 직접 build하는 방식이 있다. 두방식의 가장 큰 차이점은 yum을 통한 install은 내가 원하는 버전 선택이 안된다는것과, 소스코드 build는 귀찮다는 단점이 가장 큰 차이점으로 보이지만, 더 큰 차이점은 한글을 사용하는데 있어서 yum을 통해 install되는 2.7.* 버전은 한글사용에 문제점이 있기때문에 한글을 사용해야 하는 분들은 xercex-c홈페이지에서 3.* 버전을 다운받아서 build후 사용하시기 바랍니다.

1. build 방법
xercex-c 홈페이지에서 최신 버전의 xercex-c를 다운받은 후 특정 폴더에 압축을 해제한다.
$ ./configure
$ make

위와 같은 명령이후에 /usr/local/include 폴더와 /usr/local/lib 폴더에 보면 해당하는 라이브러리 파일과 헤더 파일이 존재한다. 위와 같이 존재하게 되면 빌드 자체는 성공적으로 완료된 것이다.

2. 사용방법
해당라이브러리를 사용하기 위해서는 컴파일 옵션과 실행시 해당 라이브러리를 링크해줘야 한다.
컴파일
-I(대문자 I) 옵션   : 해당 라이브러리 해더 파일이 존재하는 include 폴더를 선택해 줘야 야 함
-l(소문자 L) 옵션  : 해당 라이브러리 이름을 선택
-L                      : 해당 라이브러리가 존재하는 폴더 선택
gcc -I /usr/local/include -lxercex-c -L /home/workspace/lib

실행
실행시는 해당 라이브러리가 존재하는 PATH를 시스템에 설정해 줘야 한다. 해당 라이브러리 Path는
$ export LD_LIBRARY_PATH=/usr/local/lib:$LD_LIBRARY_PATH

더 자세한 내용은 해당 홈페이지를 살펴보면 편하게 사용하실 수 있을 것이다. 또한, xercex-c는 윈도우와 다른 OS에서도 사용 가능하기 때문에 해당 OS사용자들은 홈페이지를 통해 사용 방법과 설정 방법을 습득하면 될 것이다.
마지막으로 xercex-c는 dom, sax, sax2를 모두 지원한다고 나와있다. 그리고 직접 C++상에서 xml을 파싱하는 내용은 추후 다시한번 포스팅 하도록 하겠다.

:: 관련 링크 ::
apache xercex-c :: http://xerces.apache.org/xerces-c/





2008. 4. 17. 11:30
VB로 작성된 ActiveX같은 경우는 VisualStudio( 이하 VS )에 포함된 배포마법사를 통해서 작성가능 하나!
VS같은 경우는 따로 CAB을 만들어 줘야 한단다!( 어제부터 왜이리 삽질을 하는건지..ㅜㅜ; )
머 우짜든 일단 컴파일 시키는거까지 성공했고 이제는 배포를 해보자

배포파일 작성 순서는 다음과 같다.
1. .inf파일 작성
2. .ocx 파일과 .inf파일을 .cab 파일로 압축
3. 압축된 .cab파일 서명
4. .cab파일을 웹 페이지에 등록

그럼 위 순서를 하나하나 따라가 보자!!!

1. .inf파일 작성
VB같은 경우는 배포마법사에서 VB Project를 설정하면 자동으로 .inf파일이 생성되나, VC++은 사용자가 스스로 만들어 줘야 한단다!( C++은 넘 불편해!!ㅠㅠ )
 ;======================= testActiveX.inf ===================
[Version]
signature="$CHICAGO$"
AdvancedINF=2.0

[Add.Code]
testActiveX.ocx=testActiveX.ocx
; 작성된 ActiveX에 종속되어져야 하는 dll을 나열한다.
mfc42.dll=mfc42.dll
msvcrt.dll=msvcrt.dll
olepro32.dll=olepro32.dll

; 종속되는 dll들의 세부 사항을 설정
[mfc42.dll]
FileVersion=6,0,123,m0
hook=mfc42installer

[msvcrt.dll]
FileVersion=6,1,8924,0
hook=mfc42installer

[olepro32.dll]
FileVersion=5,0,4265
hook=mfc42installer
[mfc42installer]
file-win32-x86=http://activex.microsoft.com/controls/vc/mfc42.cab
run=%EXTRACT_DIR%\mfc42.exe

[testActiveX.ocx]
file-win32-x86=thiscab
clsid={XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}
DestDir=11
FileVersion=1,0,0,1
RegisterServer=yes
위 설정을 간단히 살펴보면
* ";" 는 주석을 표시한다.
[Add.Code] : 설치한 파일들을 나열한다.
testActiveX.ocx=testActiveX.ocx         ; 당연히 가장 중요한 activex파일
aaa.dll=aaa.dll                                 ; 작성한 ActiveX에 종속적인 dll들

[testActiveX.ocx]
file-win32-x86=thiscab               ; 먼지 나두 모르겠다 아시는 분 손!!
clsid={}                                   ; 작성한 ActiveX의 Class Id
FileVersion=                             ; 작성한 ActiveX의 버전
DestDir=                                   ; 압축이 풀린 cab의 ocx가 설치될 경로
RegisterServer=yes                   ; 먼지 나두 모름 이것두 아시는 분 손!!

위에서 얘기하는 DestDir의 각 설명은 다음 포스트에서 추가하도록 하겠당!
추가라기보다는 어디서 긇어 오는거겠지만!!ㅡㅡ;

나머지 부분은 ActiveX를 작성하면서 추가된 Dll 파일들을 추가해주면 된다
FileVersion         ; 설치될 dll의 버전
hook                  ; 설치할 방법을 설정하는 부분의 Title이라는데 이것두 모르겠당

자 이제 .inf파일을 작성하는것을 마치고 다음에 .cab파일 생성하는 부분을 보자

2. .cab파일 작성
.cab파일을 생성하기 위해서는 cabar.exe라는 프로그램이 필요하다. 이 프로그램과 이하 아래에서 사용되는 여타 다른 프로그램은 아래 다운로드 링크를 통해 다운받으시면 되용!
그런데 이거 이렇게 막 뿌려두 되는건가..??설마 저작권에 걸리는건 아닌가?? 머 인터넷에 돌아댕겨서 나두 올리는거지만 사실 좀 불안함 혹시 걸리는거면 바로 삭제하겠습니다.!!

cab파일 생성 예
cabarc.exe N testActiveX.cab testActiceX.ocx testActiveX.inf

이렇게 하면 cab파일로 압축이 된다. 상당히 간단!! 이런건 왜 배포 마법사에 포함을 안시켰는지 원!ㅡㅡ;

3. .cab파일 서명
cab파일 서명은 아래 보이는 명령어들을 순서대로 치면서 암호 입력하고 입력한 암호를 다시 입력하고 머 그러면 된다.
makecert -sv "mycert.pvk" -n "CN=TEST ActiveX" mycert.cer
cert2spc mycert.cer mycert.spc
signcode -v mycert.pvk -spc mycert.spc testActiveX.cab
setreg -q 1 TRUE

자 이렇게 하면 서명까지 끝나는데 웹 페이지에 올리는건 다덜 아시는대로 올리면 되고
일단 나머지 부분은 밥먹구와서 정리해야징!!ㅋㅋㅋ
참고 사이트 : http://rnd.vitzro.com/Language/VisualC/MakeCab.htm


2008. 4. 16. 23:59
아래 글에 이어서 이 warning은 VS2005를 사용해서 XSI v6.0의 com api dll을 다시 컴파일 할 때 나타나는 warning이란다.!
( Recompiling COM API dll for XSI v.6.0 using Visual Studio .NET 2005 )
영문을 그냥 직역하다 보니 이해가 좀 안되지만???
머 우짜든 나는 에러는 다음과 유사하다
warning C4278: 'GetObject': identifier of typelibrary 'XXXX.tlb' is already macro. Please use 'rename' modifier.

warning C4278: 'GetObject': 형식 라이브러리 'XXXX.tlb'의 식별자가 이미 매크로입니다. 'rename' 한정자를 사용하십시오

위에서 GetObject는 warning이 나는곳마다 다 틀리다 왜냐 라이브러리마다 모두 다 틀리기 때문에 우짜든 형태는 위와 유사하고 warning이 발생한 곳은

XXXX.tbl를 import한 곳이다.
영문 그래로 rename 한정자를 사용해 다음과 같이 수정해 주면 된다.

#import <XXXX.tlb> rename( "GetObject", "GetObjectA" )

GetObject는 warning난 매세지에 나타난 이름을 그대로 사용하면 되고 두번째 파라미터는 아무렇게나 원하는 이름으로 재명명 해주면 된다.

일단 warning은 잡자!!!


2008. 4. 16. 23:28

이번 프로젝트에 사용할 ActiveX 컨트롤러를 만드는 중에 VC6로 작성된 것을 VS2005로 컴파일 할라고 하는디!
이게 어찌된 일인지 컴파일 하면 이것저것 마춰야 하는게 왜 그리 만은지!!

이왕 정리하기로 맘먹은거 하나하나 해결하면서 정리해 보자.

1. For문의 지역 변수 스코프

for( int i = 0; i < 5; i++ )
{
}
for( i = 0; i < 10; i++ ) {}
VS6에서는 위와같이 작성해두 된다고 한다. 이유는 모르지만( 역시 난 C와 C++은 쥐약이야ㅠㅠ)
머 일단 문제가 발생하고나서는 당연지사 스코프 문제로 아래쪽 for문에서 i를 int형 혹은 해당하는 형으로 선언해주니 문제 해결

2. warning C4996
이넘의 워닝! 아주 죽을 맞이다.! 어찌하면 안날까? ActiveX자체두 잘 모르는디! ㅡㅡ;
일단 나타나는 워닝을 인터넷을 찾아댕기면서 하나한 해결해 보자! 이럴 시간두 없는디!ㅡㅡ;
warning C4996: 'strcpy': This function or variable may be unsafe. Consider using strcpy_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
VS2005에서 부터는 CRT라이브러리 함수의 문자열을 다루는 함수의 안정성에 많은 신경을 쓰면서 기존의 문자열 함수에 _s를 붙여서 버퍼의 길이를 지정하도록 권장하고 있기 때문에 strcpy같은 문자열 함수에서 위와 같은 warning이 발생한다.

위와 같은 warning이 나타날 경우에는 stdafx.h 파일 상단에 아래와 같이 정의해 주면 된단다.
#define _CRT_SECURE_NO_WARNINGS
혹은
#define _CRT_SECURE_CPP_OVERLOAD_STANDARD_NAES 1
혹은
#define _CRT_SECURE_NO_DEPRECATE
위의 정의가 뜻하는 바는 시간이 없어서 패스.

다음으로
warning C4996: 'stricmp': The POSIX name for this item is deprecated. Instead, use the ISO C++ conformant name: _stricmp. See online help for details.
위와 같은 warning이 날 경우에는 stdafx.h 파일 상단에
#define _CRT_NONSTDC_NO_DEPRECATE
위와 같이 정의해 주면 된단다.!!

일단 지금까지 나온 warning을 바탕으로 해결된 내용..
난중에 추가적인 내용이 나오면 다시 붙여보장!!

'ººº::Development™:: > ::C/C++™::' 카테고리의 다른 글

[툴] Windows Crash Dump 분석  (0) 2009.04.10
[C/C++] 디렉토리 만들기..  (1) 2008.12.04
[C/C++] 오늘 날짜 구하기  (1) 2008.12.03
[C/C++] apache xercex-c 사용하기  (0) 2008.11.06
[C/C++] warning C4278  (0) 2008.04.16


prev"" #1 next