Sambar 님 의견 스크랩했습니당. ^^

 

 

#pragma warning 경고 메시지와 관련된 지시자로서

#pragma warning(disable : 4786)
#pragma warning(disable : 4100)

 

사용하여 특정 Waring을 무시하자~!!!

 

#pragma warning (push, 3) // warning level change 4 -> 3 and pop 3
#include ..........

#pragma warning (pop)

 

어디서 발췌했는지 기억이 --;

헤더 파일 : fopen - stdio.h, _wfopen - stdio.h 또는 wchar.h

기능 : 파일을 연다.

더 안전한 버전 : fopen_s, _wfopen_s

Syntax : FILE *fopen(const char *filename, const char *mode);

FILE *_wfopen(const wchar_t *filename, const wchar_t *mode);


매개 변수 :
filename - 파일 이름
mode - 파일 접근 방식

 

리턴 값 : 열린 파일에 포인터를 반환한다. 오류가 발생할 경우 null 포인터값이 반환된다.

참고 :
fopen 함수는 지정된 파일 이름을 가진 파일을 연다. _wfopen은 fopen의 확장 문자 버전이며, 그 밖의 기능은 모두 같다. 단순히 _wfopen 함수를 사용하는 것으로는 파일 스트림에서 사용한 문자세트에 영향을 주지 않는다.

파일 접근 방식 ---

"r" : 파일을 읽기 위해 연다. 파일이 없거나 찾을 수 없을 경우 함수는 실행되지 않는다.
"w" : 파일을 쓰기 위해 연다. 파일이 이미 존재할 경우 그 파일에 저장되었던 내용은 사라진다.
"a" : 파일을 쓰기 위해 연다. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 새로 내용을 쓴다.
"r+" : 파일을 읽고 쓰기 위해 연다. 파일은 반드시 있어야 한다.
"w+" : 파일을 읽고 쓰기 위해 연다. 파일이 이미 존재할 경우 그 파일에 저장되었던 내용은 사라진다.
"a+" : 파일을 읽고 쓰기 위해 연다. 파일이 이미 존재할 경우 그 파일의 끝부분에서부터 새로 내용을 쓴다.

 

"a"나 "a+"로 파일을 열 때 쓰기 작업은 파일의 끝부분에서 시작한다. 파일 포인터는 fseek이나 rewind 함수로 이동시킬 수 있지만 쓰기 작업 이전에는 포인터가 파일 끝으로 되돌아간다. 그래서

존재하는 데이터는 덮어쓸 수 없다.

w랑 w+의 차이가 그래서 머라는거야?-_-;

Example ==========

소스 코드 -----

#include <stdio.h>

FILE *stream, *stream2;

void main()
{
int numclosed;

// 파일을 읽기 위해 연다.
if( ( stream = fopen( "test.txt", "r" )) == NULL )

printf( "파일 열기 실패 : test.txt\n" );
else
printf( "파일 열기 성공 : test.txt\n" );

 

// 파일을 쓰기 위해 연다.
if( ( stream2 = fopen( "test2.txt", "w+" )) == NULL )
printf( "파일 열기 실패 : test2.txt\n" );
else
printf( "파일 열기 성공 : test2.txt\n" );

 

// 스트림이 닫혔을까? NULL이 아니면 아직 안 닫힘 so 지금 닫는다.
if ( stream )
{
if ( fclose( stream ) ) // 파일을 닫는 함수
{
printf( "아직 안 닫힌 파일을 방금 닫았어 : test.txt\n" );
}
}

 

// 나머지를 닫는다.
numclosed = _fcloseall( );
printf( "_fcloseall 함수로 닫은 파일의 수 : %u\n", numclosed );
}

출력 -----

파일 열기 성공 : test.txt
파일 열기 성공 : test2.txt
_fcloseall 함수로 닫은 파일의 수 : 1

입사 후 개발환경

OS: Window 7 64bit 환경에 VS 6.0,

 

상기 사양으로 개발하다보니, 디버깅 중 프로그램 종료시 Process가

살아있는 현상이 자주 발생하여, 항상 VC tool을 다시 구동해야

하는 번거로움이 있는데, 하기 처럼 하기 정상적으로 구동된다. ~~

 

--------------------

방법 1.

TLLOC.dll 파일을
C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\Bin
폴더에 덮어쓴다.

원본 파일은 만약을 위해 다른 이름으로 변경한뒤 복사.

 

 

방법 2

ShiftF5Fix.dll 파일을
C:\Program Files (x86)\Microsoft Visual Studio\Common\MSDev98\AddIns
폴더에 복사한 뒤,
툴바 빈곳 오른쪽 마우스 클릭 - customize - Add-ins and Macro Files 탭 선택
ShiftF5Fix 체크하고 VS 종료후 다시 실행한다.

--------------------

 

 

개발중에 다른 OS에서 소스 수정작업을 진행하다 보니,

소스 저장날짜가 현재 작업중인 OS의 날짜보다 앞서있는 경우,

rebuild되는 현상이 발생.. 하기와 같이 조치하였다.

 

======================================================================

컴파일 할때 파일 시간을 보고 마지막 컴파일 시간 보다 이후면 새로운 파일로 보고
컴파일을 수행하기 때문에, 소스 파일의 저장 날짜를 확인해서 현재 날짜나 그 전날짜로 되어야 함

======================================================================

작업시 warning 경고가 발생하여 하기와 같이 조치하였다.

 

LINK : warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use
/NODEFAULTLIB:library

 

이 링크 에러는 윈도우에서 컴파일 하면서 자주 볼수 있는 에러다.
워닝이라고 나오지만 그냥 에러다. 위에 에러 쫘자작~~~

말그대로 LIBCD 라이브러리가 충돌난다는 것이다.
컴파일시에 이 옵션을 추가해줘야 한다.

/NODEFAULTLIB:LIBCD.lib

 

VC 6.0의 Project-setting ->link -> Project option에 내용 추가 필요하다.

 

/nodefaultlib:"libcd.lib"


제대로 컴파일 되는걸 볼 수 있을 것이다.

 

// VC++을 이용하여 Excel Automation 이용 시 Tips

// API를 찾아보시면 정말 노가다라는 표현이 적절하다고 느끼실겁니다.

// 코딩을 하다가 함수 사용법을 찾아보느라 정말 시간이 오래걸렸네요.

// 물론 찾지 못한 것은 통밥으로 대입해보거나 엑셀 매크로를 참조했습니다.

// 코딩하시는 분들에게 도움이 될까해서 정리해봅니다.

// 초기화 작업은 msdn에서 찾아보시기 바랍니다.

// 퍼가실 땐 스크랩으로~~ 아시죠? ^^ 즐프하시기 바랍니다.

// 객체 및 변수 선언

_Application gObjApplication;
Workbooks gObjWorkbooks;
_Workbook gObjWorkbook;
Range gObjRange;
Worksheets gObjWorksheets;
_Worksheet gObjWorksheet;
Comment objComment;

 

Font font;
Borders borders;
Border bdLeft, bdTop, bdRight, bdBottom;
Interior interior;
Shapes objShapes;
Shape objShape;

 

COleVariant oleVariant((long) DISP_E_PARAMNOTFOUND, VT_ERROR);
COleVariant VFalse((short)FALSE);

CString strStartCell, strEndCell; // 셀의 좌표
CString strText;

 

// 엑셀 프로세스 시작 및 쉬트 객체를 얻음

gObjApplication.CreateDispatch("Excel.Application")

gObjWorkbooks = gObjApplication.GetWorkbooks();
gObjWorkbook = gObjWorkbooks.Add(oleVariant);
gObjWorksheets = gObjWorkbook.GetWorksheets();
gObjWorksheet = gObjWorksheets.GetItem(COleVariant((short) 1));

// 파일(strFileName)로 저장
gObjWorkbook.SaveAs(COleVariant(strFileName), COleVariant((long)1), COleVariant("", VT_BSTR), COleVariant("", VT_BSTR), VFalse, VFalse, 1, COleVariant((long) 1), oleVariant, oleVariant, oleVariant);

 

// 엑셀 프로그램 실행
gObjApplication.SetVisible(TRUE);
gObjApplication.SetUserControl(TRUE);

// Sheet Name 설정
String strSheetName;
strSheetName = "Sheet";
gObjWorksheet.SetName(LPCTSTR(strSheetName));

// Cell Merge
strStartCell = "A1";
strEndCell = "C1";
gObjRange = gObjWorksheet.GetRange(COleVariant(strStartCell), COleVariant(strEndCell));
gObjRange.SetColumnWidth(COleVariant(10.33)); // 100 pixel

 

// Text Insert
strText = "Test";
gObjRange.SetValue(COleVariant(strText));


// 좌기준 : -4131, 가운데기준 : -4108, 우기준 : -4152
gObjRange.SetVerticalAlignment(COleVariant((short)-4108)); // 수직 가운데기준
gObjRange.SetHorizontalAlignment(COleVariant((short)-4152)); // 수평 우기준

 

// Font : size 10, 굴림체, Bold, Italic
gObjRange = gObjWorksheet.GetRange(COleVariant(strStartCell), COleVariant(strEndCell));
font = gObjRange.GetFont();
font.SetSize(COleVariant((short)10));
font.SetName(COleVariant("굴림체"));
font.SetBold(COleVariant((short)1));
font.SetItalic(COleVariant((short)1));

 

// 셀 서식 : 텍스트
gObjRange.SetNumberFormatLocal(COleVariant("@"));

 

// 셀 테두리(border)


// 모든 테두리
gObjRange = gObjWorksheet.GetRange(COleVariant(strStartCell), COleVariant(strEndCell));
borders = gObjRange.GetBorders();
borders.SetLineStyle(COleVariant((short)1)); // single line

 

// 바깥쪽 테두리
gObjRange = gObjWorksheet.GetRange(COleVariant(strStartCell), COleVariant(strEndCell));
borders = gObjRange.GetBorders();

 

// left=7, top=8, right=10, bottom=9
bdLeft = borders.GetItem((long)7);
bdLeft.SetLineStyle(COleVariant((short)1));

bdTop = borders.GetItem((long)8);
bdTop.SetLineStyle(COleVariant((short)1));

bdRight = borders.GetItem((long)10);
bdRight.SetLineStyle(COleVariant((short)1));

bdBottom = borders.GetItem((long)9);
bdBottom.SetLineStyle(COleVariant((short)1));

COLORREF color = RGB(255, 255, 255);
interior = gObjRange.GetInterior();
interior.SetColor(COleVariant((double)color));

 

// 그림 삽입 및 크기 설정
objShapes = gObjWorksheet.GetShapes();
objShape = objShapes.AddPicture(strPictureName, // Filename
(long)0, // LinkToFile
(long)-1, // SaveWithDocument
(float)left, // Left
(float)top, // Top
(float)width, // Width
(float)height); // Height

objShape.SetWidth((float)width);
objShape.SetHeight((float)height);

 

// 메모 저장 및 로드(Comment)
gObjRange = gObjWorksheet.GetRange(COleVariant(strStartCell), COleVariant(strStartCell));
CString str = "Memo";
objComment = gObjRange.AddComment(COleVariant(str));

int index = 1;
objComment = objComments.Item(index); // 메모 객체
str = objComment.Text(COleVariant(""), COleVariant((long)1), COleVariant((short)FALSE));
gObjRange = objComment.GetParent(); // 메모의 parent는 셀의 범위

COleVariant value = gObjRange.GetValue2();
if (value.vt != VT_BSTR)
value.ChangeType(VT_BSTR);
CString strValue = value.bstrVal;


// 엑셀 프로세스 종료 작업
if (font.m_lpDispatch)
font.ReleaseDispatch();

if (borders.m_lpDispatch)
borders.ReleaseDispatch();

if (bdLeft.m_lpDispatch)
bdLeft.ReleaseDispatch();

if (bdTop.m_lpDispatch)
bdTop.ReleaseDispatch();

if (bdRight.m_lpDispatch)
bdRight.ReleaseDispatch();

if (bdBottom.m_lpDispatch)
bdBottom.ReleaseDispatch();

if (interior.m_lpDispatch)
interior.ReleaseDispatch();

if (objComment.m_lpDispatch)
objComment.ReleaseDispatch();

if (objShapes.m_lpDispatch)
objShapes.ReleaseDispatch();

if (objShape.m_lpDispatch)
objShape.ReleaseDispatch();

if (gObjRange.m_lpDispatch)
gObjRange.ReleaseDispatch();

if (gObjWorksheet.m_lpDispatch)
gObjWorksheet.ReleaseDispatch();

if (gObjWorksheets.m_lpDispatch)
gObjWorksheets.ReleaseDispatch();

if (gObjWorkbook.m_lpDispatch)
{
gObjWorkbook.Close(COleVariant((long) FALSE), oleVariant, oleVariant);
gObjWorkbook.ReleaseDispatch();
}

if (gObjWorkbooks.m_lpDispatch)
{
gObjWorkbooks.Close();
gObjWorkbooks.ReleaseDispatch();
}

gObjApplication.Quit();
gObjApplication.ReleaseDispatch();
gObjApplication.DetachDispatch();

 

Excel 다루기

 

 

[발췌] http://cafe.naver.com/prostudy12.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=78&

 

VC++ 프로젝트에 첨부된 압축화일 안에 화일들을 추가하시고 엑셀출력할 때는
엑셀객체의 멤버함수의 파라메터를 잘 바꿔서 사용하세요


//헤더화일
#include "Excel.h"
#include "ExcelObject.h"

//아래는 셈플입니다.

OnExcelFile()
{
// TODO: Add your control notification handler code here

 

// 엑셀객체 생성
CExcelObject excel;

CString strExcelFile = "";
CString strPathName = "";
CString strData = "";

// 엑셀을 초기화한다.
if (!excel.InitExcel())
{
MessageBox("엑셀이 설치되었는지 확인해 주십시요");
return;
}

try
{
//저장하고자 하는 엑셀파일 이름
strPathName = ExcelPathName();
strExcelFile = ExcelFileName(strPathName);

excel->SetVisible(TRUE);


// 셀병합함수
excel.MergeSetValue('A', 1, 'E', 1, COleVariant("제목"));

//excel.MergeSetValue('A', 3, 'J', 3, COleVariant(strYM), xlRight);


// 폰트볼드함수
excel.SetBold(TRUE);

// 폰트선택
excel.SetFont("굴림");

// 폰트사이즈
excel.SetTextSize(20);

 

 

// 항목 넣기
for (i = 0; i < 5 i++) {
excel.SetColumnWidth(alpha + i, ColumnSize[i]);
excel.SetValue('A' + i, 4, COleVariant(ColumnList[i]), xlCenter);
}

excel.AutoFit('A' + 14, 4, 'K', 4);

// 틀
excel.SetBorderStyle('A', 4, 'K', 4);


// 셀의 내용
excel.SetValue('A', 5 + i, COleVariant("테스트"), xlCenter);

 

excel.m_Book.SaveAs(COleVariant(strExcelFile),
OLE_OPTIONAL,
OLE_OPTIONAL,
OLE_OPTIONAL,
OLE_OPTIONAL,
OLE_OPTIONAL,
0,
OLE_OPTIONAL,
OLE_OPTIONAL,
OLE_OPTIONAL,
OLE_OPTIONAL);
}
catch (COleException* e)
{
e->Delete();
}
catch (COleDispatchException* e)
{
e->Delete();
}
catch (...)
{
MessageBox("알수없는 에러");
}
}

 

==> 데브피아 발췌함.

첨부파일을 Microsoft Visual Studio/Common/MSDev98/Bin 경로 아래에 덮어쓸것.

버그가 ix된 버전의 dll 이지만,

공식적인 자료는 아닐지라도 사용하시는 분들이 계시다면 불편함을 어느정도 해결 할 수 있을 것으로 보여집니다.

참고 사이트 : http://social.msdn.microsoft.com/Forums/en/vsdebug/thread/a9914982-ff0f-4981-b1f3-f0c936fec74e

// 또하나의 방법.. 밑에있는게 더 잘되는듯..

I developped a little fix for that.
You just have to copy the file "ShiftF5Fix.dll" into "Common/MSDev98/AddIns/" et load it from Visual.


It's an hugly fix.
If you modify your source file during debugging you have you answer "NO" to the poup displayed after you press "SHIFT+F5" to stop the process.


link : http://www.dr-hoiby.com/ShiftF5Fix.dll

 

 

개발환경: Win7 Home, 한글 OS

VC 6.0은 기본적으로 유니코드를 지원하지 않는다.

하여.. 하기와 같이 유니코드를 사용하고자하는 경우...

 

작업순서..

1. 메모장에 일본어등을 입력한후 유니코드로 저장한다.

2. OS의 제어판의 언어 -> 고급 탭(관리자 옵션) -> 유니코드를 지원하지 않는 프로그램용 언어

-> 시스템 로캘 변경 (일본어) 후 Rebooting..

3. 프로그램에서 작성된 1)의 file을 loading한다.

이때는 일본어가 Multi byte 표현되기 때문에 하기와 같은 순서를 따른다.

 

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

const int READ_CNT = 200;

CString strbuf;
FILE *fp;
wchar_t buff[READ_CNT]={0,};
char abuff[READ_CNT]="";

fp = _wfopen(CLR_RC_JP_PATH, L"rb, ccs=UNICODE");// 유니코드 바이너리로 파일 오픈.

fgetc(fp); // 2 byte.. reading. to Unicode separator // 최초 2 byte는 해당 file이 유니코드임 알림
fgetc(fp); // 2byte는 삭제..

while(fgetws(buff, READ_CNT, fp) != NULL) // 한줄씩 읽어낸다.
{
int nLen = WideCharToMultiByte(CP_ACP, 0, buff, -1, NULL, 0, NULL, NULL); // CP_ACP/ 949 kor, 932, jp
WideCharToMultiByte(CP_ACP, 0, buff, -1, abuff, nLen, "?", NULL);

strbuf+=abuff;
memset(buff, 0x0, sizeof(buff));
memset(abuff, 0x0, sizeof(abuff));
}

fclose(fp);

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

 

4. VC 6.0에서 유니코드를 지원하게 하는 방법은 VC 6.0 설치시

첨부 파일 참조 할것..

발췌 : http://www.cyworld.com/handu76/2470611

+ Recent posts