사례1)

warning C4819: The file contains a character that cannot be represented in the current code page (949). Save the file in Unicode format to prevent data loss


닷넷에서 한글로 주석을 달면 나올 수 있는 워닝이라고 한다...

그래서인지 구글에서 검색해보면 이 워닝으로 귀찮아하는 외국인을 찾을 수 없다ㅎㅎ


#pragma warning(disable:4819) 로 무시해주거나~

주석을 영어로 달면 해결될듯?? <- 이방법은 안해봤으나 앞으로는 이렇게 해야겠다고 맘먹는중??ㅎㅎ


사례2)


warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오


d3d9types.h 에 보면..


1801번째 줄에서 볼수 있는 구조체 이다.

( Ctrl + G 를 누르면 한방에 갈 수 있다는 것은 알고 있죠?! 마우스 휠 비비지 말자.. 남들 보면 오해한다.. -0-? 뭘?! )


typedef struct _D3DDEVINFO_VCACHE {
    DWORD   Pattern;                    /* bit pattern, return value must be FOUR_CC(멌? 멇? 멌? 멖? */
    DWORD   OptMethod;                  /* optimization method 0 means longest strips, 1 means vertex cache based */
    DWORD   CacheSize;                  /* cache size to optimize for  (only required if type is 1) */
    DWORD   MagicNumber;                /* used to determine when to restart strips (only required if type is 1)*/
} D3DDEVINFO_VCACHE, *LPD3DDEVINFO_VCACHE;


주석문중에 깨진 글자가 보일 것이다.


과감히 지워주자... 이제 더이상의 찜찜한 기분은 느낄 필요가 없다..



VS.NET 2003 혹은 2005로 컴파일을 하다보면


warning C4819: 현재 코드 페이지(949)에서 표시할 수 없는 문자가 파일에 들어 있습니다. 데이터가 손실되지 않게 하려면 해당 파일을 유니코드 형식으로 저장하십시오.


이런 형태의 warning 메세지를 확인할 수 있습니다. warning 이기는 하지만 그래서 상당히 눈에 거슬리는 부분이 아닐 수 없습니다.

그래서 이번에 그 원인과 해결방법을 알아 보고자 합니다.



[원인]

ANSI로 인코딩된 소스코드를 VS.NET 2005 (한글판)에서 빌드하면서 발생하는 문제로 일본판의 경우에도 비슷한 문제가 발생하였고 영문판 VS.NET 2005에서는 발생하지 않는 것으로 알려졌습니다.

MS에서도 이를 버그로 인정하고 다음 버전에서 수정한다고 합니다.



[해결방안1]

#pragma warning(disable: 4819)

이 문장을 상단에 위치시켜서 해당 warning이 표시되지 않게 한다.



[해결방안2]

VS.NET 2005의 경우

'프로젝트->속성->구성속성->C/C++->고급->특정 경고 사용 안함'

항목에 4819와 같이 무시하고 싶은 경고 메세지 번호를 넣는다.



[해결방안3]

세번째로는 warning이 발생하는 파일을 새롭게 유니코드 형태로 저장하는 방법입니다.


VS.NET 2005의 경우

'파일->저장 고급 옵션'

"유니코드 - 코드페이지 1200" 형태로 저장을 선택하시면 됩니다.


메모장 등 기타 편집기를 이용하셔도 됩니다.



현재 전반적으로 사용하는 방법이 위에 3가지 정도 인듯 합니다.

저의 경우 이 warning이 DXSDK에서 발생해서 당황했었던... ^^

처음엔 #pragma 형태로 했었는데 해결방안2 형태로 하니까 편하더군요.. ^^

블로그 이미지

요다할아범

,

비쥬얼 스튜디오 2005에서 컴파일 하다 보면 위의 warning이 뜨는것을 볼 수 있다.

몇가지 경우가 있는듯 한데

대표적으로 예전의 문자열 관련 CRT 함수를 쓰면 나타난다.

위 warning의 의미는 "VS2005에서 이전 문자열 관련 CRT함수의 안전성을 강화하기 위하여

"_s"가 붙는 함수를 다시 만들었기 때문에 될 수 있으면 이전에 사용하던 함수는 사용하지 마라" 정도가 되겠다.


예) strcpy  -> strcpy_s


안전성이라고 해봐야 특별한것은 없고 메모리 관련 에러가 나면 확실하게 에러를 표시해 주는 기능 정도인거 같다 (이전 함수들은 메모리 버퍼의 크기에 대한 보장을 못함). 그래도 메모리 관련 에러가 나면 그 결과가 엉뚱한 데서 나타날 수가 있으므로 여간 찾기 어려운 것이 아닌데 이런 사소한것 부터 조심스럽게 쓰면 좀 더 안전하게 코딩할 수 있지 않을까 생각이 든다.

그래서 요즘 드는 생각들이 C 함수 보다는 C++이 제공해주는 (엄밀하게 말한다면

C++ 로 만든 표준 라이브러리)클래스를 보다 폭넓게 사용하는것이 좋겠다라는 생각이 든다.

STL에서 제공해주는 스트링 클래스나 여러 컨테이너를 사용한다면 직접 문자열을 다룬다거나

new delete를 사용하는 빈도가 줄어들터이니...


java가 부러운점이 있다면

필요로하는 거의모든 라이브러리를 표준차원에서 제공해준다는것이다.

C++ 같은경우 간단한 문법(사실 문법자체도 어렵거니와)과 STL을 뺀다면

표준이랄께 없기 때문이다.

투정이 좀 길었는데

처음으로 돌아가서

만약 이전에 짜놓았던 코드를 고치기 힘들면 복잡하게 생각할꺼 없고

stdafx.h 파일의 최 상단에

#define _CRT_SECURE_NO_DEPRECATE

한줄 넣어버리면 그만이다...

블로그 이미지

요다할아범

,

인클루드

#include <atlconv.h>


CString bstrToCString(BSTR bstr)

{
   char* pbstr;
   USES_CONVERSION;  //convert
를 위한 매크로
   pbstr=OLE2A(bstr);   //bstr
char convert
   return CString(pbstr);
}


BSTR CString Tobstr(CString str)

{
    return str.AllocSysString();    //CString
bstr convert
}


[bstr-> char*]

BSTR inputdata;
char *pbstr;
pbstr=OLE2A(inputdata);


[char*->bstr]

TCHAR szTitle[ 512 ];
_bstr_t bstrText = szTitle;
*bstrTitle = bstrText.copy();


//CString ==> CComVariant로 변환
 CComVariant out(str.AllocSysString());  or  CComVariant out(str);

 

----------- VARIANT 구조체 사용예 ----------

VARIANT vVal;

VariantInit(&vVal); //초기화

vVal.vt = VT_BOOL;

vVal.boolVal = TRUE;

 

---------- BSTR 사용예 --------------

1) BSTR m_pStr;

m_pStr = L"Hello CodeIn"; // 문자의 개수가 지정되지 않음

 

2) wchar_t Example[] = L"String";

BSTR m_pStr = SysAllocString(Example); // BSTR 문자열 영역확보

//..

SysFreeString(m_pStr); // BSTR 문자열 영역 해제

 

---------------- CComVariant, CComBSTR ---------------

VARIANT  => CComVariant;

BSTR => CComBSTR


블로그 이미지

요다할아범

,

자꾸 까먹는다....

VS6으로 개발할때 다이얼로그에 사용되는 버튼, 프로그레스바, 스태틱바 등등의 컨트롤을 가지고 있는
도구모음을 닫았을때 다시 여는 방법을 말이다.

벌써 VS6 사용한지 어언 햇수로 7년이 되어 가지만...

이것만은 항상 바로 생각나지 않고

고민하게 된다.

흑흑...

이러다 몇년 지나면 아예 기억을 못할지도 모른다.

그러기전에 적어놔야지... ㅡ.ㅡ(무슨 메멘토냐?)

어쨌든

메뉴 있는데서 오른쪽 마우스를 지긋이 누르면 나오는 메뉴에서 Controls 선택하면

뿅 나온다.

...
...

왜 이렇게 슬퍼지지?

블로그 이미지

요다할아범

,
원본 http://www.zdnet.co.kr/builder/dev/etc/0,39031619,10066417,00.htm
 
 
나만의 CD 제작 프로그램 만들기
윈도우 XP IMAPI를 이용한 CD Burn 프로그래밍
현륜식 ( ZDNet Korea )   2004/02/11
 
윈도우 XP는 IMAPI를 이용해 단순히 끌어서 놓거나 보내기를 통해 CD-R이나 CD-RW로 CD를 구울 수 있습니다. 여기서는 윈도우 XP에 내장된 IMAPI를 이용해 윈도우 XP와 같은 CD Burn 프로그램을 구현해 보고 향후 IMAPI가 어떻게 변화해 갈 지 전망해 봅니다.
현 재 윈도우 XP는 컴퓨터를 사용하는데 필요한 기능을 모두 가지고 있습니다. 그 중에 가장 눈에 띄는 것이 새롭게 내장된 CD Burn 기능입니다. 이 기능은 MS의 요청에 따라 아답텍에서 만든 IMAPI(Image Mastering API)를 이용하는데, 이지CD 크리에이터의 다이렉트 CD와 같다고 생각하면 됩니다.

기존에 이지CD 크리에이터 사용자라면 혹시 엔진이 불안정하지 않을까 생각할 지도 모릅니다. 실제로 아답텍의 이지CD 크리에이터는 프로그램의 불안정으로 인한 잦은 패치로 사용자들의 불만을 샀기 때문입니다. 초기에 윈도우 XP에 내장된 IMAPI도 이지CD 크리에이터나 네로(Nero) Burn 등의 다른 프로그램과의 호환성 문제 및 CD 기록기기와의 문제가 있었지만 지금은 거의 다 해결된 상태이므로 걱정할 필요는 없습니다.

CD Burn 프로그램 설계·구현
CD에 파일을 저장하거나 복사할 때 운영체제는 사전에 하드 드라이브에 이미지를 마스터한 후 CD를 굽게 됩니다. 이때 사전 마스터링은 기록 과정상에 에러가 생기는 것을 방지하고 고속 기록시에 미디어가 필요 없이 렌더하는 것을 최소화합니다. IMAPI는 이 이미지를 마스터링(혹은 CD Burn)하는 API라는 뜻으로, 현재 줄리엣(Jolliet)과 ISO9660 형식의 데이터 디스크와 레드북 형식의 오디오 디스크를 지원하고 있습니다.

IMAPI와 COM 객체
IMAPI에는 네 개의 주요 COM 객체와 인터페이스가 있습니다.

① MSDiscMasterObj
② MSDiscRecorderObj
③ MSDiscStashObj
④ MSBurnEngineObj

MSDiscStashObj와 MSBurnEngineObj 객체는 IMAPI에 접근하는 내부 인터페이스로, IMAPI 아키텍처를 쉽게 이해할 수 있도록 간단히 언급만 되어 있습니다. MSDiscStashObj(IDiscStash 인터페이스를 통해)는 MSDiscMasterObj에 이용되는 Raw 파일(800MB까지 허용)로 구워질 오디오 이미지나 데이터 디스크라고 생각하면 됩니다. 이 Stash는 로우 레벨 엔진으로부터 굽기가 요청되면(IMSBurnEngine 인터페이스를 통해) MSBurnEngineObj로 건네집니다.

그 외 MSDiscMasterObj 객체는 다음 다이어그램처럼 세 개의 인터페이스를 제공합니다. 그 중 IDiscMaster 인터페이스는 IMAPI 열기와 지원 포맷 나열하기, 포맷 선택하기, 레코더 리스트 보이기, 레코더 선택하기, 굽기, IMAPI 닫기 등을 할 수 있습니다.

사용자 삽입 이미지
<그림 1> IMAPI v1 아키텍처

그리고 IJolietDiscMaster와 IRedbookDiscMaster 인터페이스는 각각 데이터와 오디오 디스크를 컨트롤하며 IDiscMaster 인터페이스를 통해 포맷을 선택한 후 사용할 수 있습니다. 또 MSDiscRecorderObj 객체는 IDiscRecorder 인터페이스를 통해 접근할 수 있습니다. IMAPI와 호환되는 모든 CD-R과 CD-RW 디바이스는 MSDiscRecorderObj 객체를 가지고 있으며, CD 굽기에 사용될 디바이스를 선택하기 위해 MSDiscRecorderObj 객체의 IDiscRecorder 인터페이스 포인터를 사용합니다. 이를 통해 굽는 속도와 다른 여러 변수들을 설정할 수 있습니다.

이 외에 CD를 굽기 위해 ICDBurn 인터페이스를 사용할 수 있는데 이는 윈도우 셸로, CD에 파일을 쓰기 한 하드웨어가 시스템에 있는지 알아보고 그 디바이스의 drive letter를 알아낼 수 있습니다. 또 staging 파일을 CD로 만들 수 있는데, 이 역시 IMAPI를 기반으로 만들어져 있습니다.

사용자 삽입 이미지
 
<그림 2> MSDiscMasterObj

 


Code Project - CD Burner : http://www.codeproject.com/win32/CD_Burner.asp
블로그 이미지

요다할아범

,