블로그 이미지
Every unexpected event is a path to learning for you.

카테고리

분류 전체보기 (2738)
Unity3D (817)
Programming (475)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (228)
협업 (58)
3DS Max (3)
Game (12)
Utility (136)
Etc (96)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (53)
Android (14)
Linux (5)
잉여 프로젝트 (2)
게임이야기 (3)
Memories (20)
Interest (38)
Thinking (38)
한글 (30)
PaperCraft (5)
Animation (408)
Wallpaper (2)
재테크 (18)
Exercise (3)
나만의 맛집 (3)
냥이 (10)
육아 (16)
Total
Today
Yesterday
05-05 09:19

안녕하세요. 파코즌 원정상입니다.

금일 회사에 불법소프트웨어 단속이 들이 닥쳤습니다. ㅠㅠ

본의 아니게 사용하고 있는 불법 소프트웨어가 있을수도 있고, 자의에 의해서 사용하는 프로그램도 있을수 있습니다.

가끔 라이선스를 교묘하게 해놔, 기업의 개인사용자(?)들이 알게 모르게 불법을 사용하게끔 조장하는일이 있어(타의든 자의든) 오늘 이렇게 정리해 보았습니다.

(이 사이트에도 무료 프로그램 정리된것이 많은데, 개인과 기업 사용자들의 구분이 쉽지가 않아, 이렇게 기업용도 가능한 소프트웨어만 따로 모아봤습니다.)

아래 프로그램들은

개인뿐 아니라 기업에서까지 무료로 사용이 가능합니다.


오피스 프로그램

오픈오피스 : http://www.openoffice.org/

홈페이지 내용발췌 : OpenOffice.org uses the LGPL (GNU Lesser General Public License). For documentation and website content not intended to be included in the product, we use the Public Documentation License (PDL). Our License page provides more information on our licenses and on our policies regarding the application of those licenses. As well, our we have several FAQs dealing with licensing.

Telnet 프로그램


테라텀 : http://ttssh2.sourceforge.jp/

홈페이지 내용발췌 : TeraTerm Project would have been developed terminal emulator "Tera Term" and SSH module "TTSSH".

This software is open source software under BSD License.

PuTTY: http://www.chiark.greenend.org.uk/~sgtatham/putty/

홈페이지 내용발췌 : The PuTTY executables and source code are distributed under the MIT licence, which is similar in effect to the BSD licence.
 

압축 프로그램

빵집 : http://www.bkyang.com/

홈페이지 내용발췌 : 빵집은 개인, 기업, 학교, 피씨방, 관공서등 누구나 무료로 사용하실 수 있습니다.

7-zip : http://www.7-zip.org/

홈페이지 내용발췌 : 7-Zip is open source software. Most of the source code is under the GNU LGPL license.

밤톨이 : http://www.bamtory.com/new/main/main.asp
홈페이지 내용발췌 : 본 프로그램은 프리웨어로 개인/가정/사무/ 기업/관공서 등 어느곳에서나 아무런 제약없이 사용이 가능합니다.

다집 : http://datools.kr/

홈페이지 내용발췌 : 다씨(DaSee), 다집(DaZip), 다FTP(DaFTP)는 언제, 어디서, 누구나 기업체/관공서 상관없이 모든 사람이 무료로 사용할 수 있는 프리웨어입니다.
 

FTP 프로그램

파일질라 : http://filezilla-project.org/

오픈소스 진영에서 만들고 있는 강력하고, 빠르고, 좋은 프로그램~

다FTP : http://datools.kr/

홈페이지 내용발췌 : 다씨(DaSee), 다집(DaZip), 다FTP(DaFTP)는 언제, 어디서, 누구나 기업체/관공서 상관없이 모든 사람이 무료로 사용할 수 있는 프리웨어입니다.
 

에디트 프로그램

Notepad++ : http://notepad-plus.sourceforge.net/uk/site.htm
홈페이지 내용발췌 : Notepad++ is a free (as in "free speech" and also as in "free beer") source code editor and Notepad replacement that supports several languages. Running in the MS Windows environment, its use is governed by GPL License.

ACROEDIT : http://www.acrosoft.pe.kr

홈페이지 내용발췌 :

AcroEdit는 지금도 개발중이며 전문 텍스트 에디터를 표방하여 지속적으로 성능 향상을 위하여 노력하고 있습니다.

AcroEdit는 공개 프로그램이기 때문에 개인, 직장, 공공기관등 어디에서든 누구든지 사용하실 수 있습니다.

Desy Edit : http://www.desyedit.com/

홈페이지 내용발췌 :

DesyEdit를 'Funcware'라 제창합니다.

'Funcware'란 DesyEdit의 개발자가 직접 만든말로써, Freely Use No Complain의 첫머리글자만을 따서 만든 말 입니다.

말 그대로 누구나 사용할 수 있지만, 어떠한 불평도 하지 않는다는 뜻입니다.

그러나 사용자 여러분의 관심에서 나오는 질타는 달게 받겠습니다
 

CD버닝 프로그램

CDBurnerXP : http://www.cdburnerxp.se/

홈페이지 내용발췌 : Everyone, even companies, can use it for free.

InfraRecorder : http://sourceforge.net/projects/infrarecorder/

홈페이지 내용발췌 : License : GNU General Public License (GPL)


가상 드라이브 프로그램

Gizmo : http://arainia.com/software/gizmo/

프로그램 -> Help -> Documentation

: Gizmo is Freeware and is made avilable for commercial and personal use at absolutlely no cost whatsoever.
 

그래픽 툴 프로그램

GIMP : http://www.gimp.org

홈페이지 내용 발췌 : GIMP is an acronym for GNU Image Manipulation Program.

Paint.net : http://www.getpaint.net/

홈페이지 내용 발췌 :
Q: Can I use Paint.NET for business, commercial, or government use? Or is it only free for "personal" use?
A: Yes -- Paint.NET is free for all uses including personal, business, commercial, government, and school. There has been some confusion lately around the license and its seemingly hybrid MIT / Creative Commons status. Rest assured that you really only have to dive deeper into the legalities of the license if you are planning to do something such as distributing a modified version of Paint.NET. Usually this involves downloading the source code, or disassembling / decompiling stuff. If you're just installing and using Paint.NET, then there's really no need to worry about that.

사진편집 프로그램

포토스케이프 : http://photoscape.co.kr/ps/main/index.php

홈페이지 내용 발췌 : 포토스케이프는 집,회사,학교,학원에서 모두 무료입니다.


이미지 뷰어 프로그램

다씨 : http://datools.kr/

홈페이지 내용발췌 : 다씨(DaSee), 다집(DaZip), 다FTP(DaFTP)는 언제, 어디서, 누구나 기업체/관공서 상관없이 모든 사람이 무료로 사용할 수 있는 프리웨어입니다.

꿀뷰 : http://www.kipple.pe.kr/win/honeyview3
홈페이지 내용 발췌 : 꿀뷰3는 기업이나 관공서/법인/학교/게임방/무인도 등에서 맘대로 설치해서 사용 가능한 프로그램 입니다. (소프트웨어 불법 사용 단속에 걸리지 않는다는 의미)


아무쪼록 이 글 보시고, 회사 전산담당자와 상의하여 [소잃고 외양간 고치는일] 없이,

미리 미리 준비하여 주시기 바랍니다.

읽어주셔서 감사합니다.


출처 :  http://www.parkoz.com/zboard/view.php?id=my_tips&page=1&page_num=50&select_arrange=headnum&desc=asc&sn=off&ss=on&sc=off&divpage=3&keyword=&no=12886&category=&show=all

반응형
Posted by blueasa
, |

매크로는 C와 C++에서 제공되는 꽁수같은 기능이라고 할 수 있습니다.

꽁수같다라고 한 이유가  매크로는 사용자의 편의와 동시에 많은 위험성을 초래하기 때문이죠.

그래서, 대부분의 서적에서는 매크로의 사용을 자제하고 인라인(inline)과 상수형(const)을 더 지향하기도 합니다.

 

하지만, 이는 단순히 매크로의 위험성 때문이며 그 위험성의 간단한 예를 들자면,

 

#define POW( A ) A * A        // 정의했을 경우

...

POW( 10 + 10 )                // 사용자의 의도는 20 * 20 입니다.     하지만 결과는,

10 + 10 * 10 + 10             //10 + 100 + 10 = 120 이죠.

 

또한, 상수형 같은 경우는 디버깅이 불가능하다는 점도 있죠. 최근에 좋은 개발 툴은 매크로 변수를 추적도 가능하다고 합니다만... 비주얼 스튜디오 2008에서도 아직 안되더군요. :|

 

어쨌든, 그런 위험성을 제거할 수 있고 개발자 편의로 매크로를 마음껏 사용할 수 있다면, 구지 매크로를 사용을 자제할 필요가 없다고 봅니다.

 

결론은, 매크로의 사용여부는 개발자 자신에게 넘기도록 하겠고, 오늘은 매크로의 비법들에 대해서 한번 살펴보도록 하겠습니다.

매크로 사용여부는 다 알고 계신다고 가정하고, 사용 설명은 따로 하지 않겠습니다. 간단한 예를 보면 쉽게 이해가 될 겁니다.

 

#1) 열거형을 문자열로

 #define CaseEnum( A )      case( A ) : LogMsgToFile( #A )

 

switch( msg ) {

  CaseEnum( MSG_One );

    ...

    break;

  CaseEnum( Msg_Two );

    ...

    break;

  default:

    ...

    break;

}

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

switch( msg ) {

  case( MSG_One ): LogMsgToFile( "MSG_One" );

    ...

    break;

case( MSG_Two ): LogMsgToFile( "MSG_Two" );

    ...

    break;

  default:

    ...

    break;

}

 

 #2) 두 인자를 하나의 값으로 합치기

#define CAT( A, B )    A ## B

 

value = CAT( 1, 2 );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

value = 12;

 

 #3) 표준 assert에 의미있는 메세지 추가하기

#define ASSERT_MSG( A, B )  assert( a && b )  

 

ASSERT_MSG( time > 0, "time must be bigger than zero" );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

assert( time > 0 && "time must be bigger than zero" ); 

 

//사용에 있어서 큰 차이는 없지만 매크로가 더 사용자 직관적이지 않나요?

 

 #4) 컴파일 시점의 assert

//애초에 제한 조건에 벗어나면 컴파일 오류를 발생 시킵니다.

#define CASSERT( A ) typedef char __C_ASSERT__[ (A) ? 1: -1 ]

 

CASSERT( sizeof( MyEnum ) == sizeof( unsigned int ) );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

//만약 MyEnum의 크기가 16이라고 가정했을 때,

typedef char __C_ASSERT__[ ( 16 == 4 ) ? 1: -1 ]

 

16 == 4는 거짓이며 따라서 __C_ASSERT[ -1 ] 이라는 형을 정의하려고 합니다.

하지만, -1의 크기의 배열 정의는 컴파일러 입장에서 불가능하기 때문에 잡아낼 수 있죠. 

 

#5) 배열의 원소를 구하기

//자바 같은 경우는 배열의 원소 갯수를 알 수 있지만 C/C++ 에서는 기본적으로 제공되진 않습니다. 

#define NUM_ELEMENT( A ) ( sizeof( A ) / sizeof( ( A[ 0 ] ) )

 

int a[ 10 ]

int nElement = NUM_ELEMENT( a );

 

/*************컴파일 전처리가 끝나면, 위의 소스는 다음과 같이 대체 됩니다.***********************/

 

int a[ 10 ]

int nElement = 40 / 4;

 

#6) __LINE__을 문자열로

// 기본적으로 정의되어 있는 유용한 매크로들 입니다.

__LINE__ // 컴파일 시점의 행 번호를 의미하는 정수

__FILE__ // 컴파일 되는 파일 이름을 담은 문자열

__DATE__ // 컴파일 될 때의 날짜를 담은 문자열

__TIME__ // 컴파일 될 때의 시간을 담은 문자열

 

//이들을 디버깅 시 유용히 활용할 수 있습니다.

#define TO_MSG( X ) #X

 

#define __FILELINE__ __FILE__" ( " TO_MSG(__LINE__) " ) "           //VC++에서는 안될 수도 있음

 

/*************컴파일 시 다음과 같이 출력됩니다.***********************/

c:\project\main.cpp ( 105 )

 

 

 

-참고 : Game Programming Gems 3 ( 정보문화사 )-


 
[출처] 매크로 마법 (Macro)|작성자 Hermet

반응형
Posted by blueasa
, |

[펌] !!a

Tip & Tech / 2011. 6. 8. 01:41

최근 어느 오픈 소스를 살펴 보다가 a = !!b 와 같은 코드를 보게 되었습니다.

 

곰곰히 생각해보니... 그래도 도대체 왜 하는건지? -_-a

 

a와 b의 타입이 unsigned char라고 하면, 결국 a = !!b 는 a = b 인거잖아?

 

 

사실 일부 c와 같은 언어는 boolean 타입을 별도로 지원하지 않으므로,

 

2바이트의 char형을 이용하며, 엄밀히 boolean의 0 과 1 이라는 두가지 상태 그 이상의 것이 될 수도 있는 것이지요.

 

즉, b는 0 ~ 255 사이의 값이 될 수도 있으며

 

그래서 !!b는 b가 어떠한 값이든 간에 0이 아닌 이상 b의 값을 1로 바꾸어 줄 겁니다.

 

b 가 25 라고 가정할 때,

!b 는 0

!!b 는 1

 

오호...

 

그럼 a = !!b 대신 a = b를 이용했을 땐, 어떤 문제가 발생할 수 있을까?

 

 

#define TRUE 1

#define FALSE 0

 

typedef unsigned char BOOL;

 

BOOL sound_state = FALSE;

 

void set_sound_state( BOOL state ) {

    sound_state = state;

}

 

BOOL get_sound_state() {

   return sound_state;

}

 

void test() {

    

    //사용자가 실수로 TRUE 대신 임의의 값을 집어 넣었습니다.

    //그런다고 해도 컴파일 오류는 안나고 심지어 컴파일 경고도 발생하진 않겠죠.

    set_sound_state( 123 );

   

     //결국, 기대하던 OK는 출력될리가 없습니다.

     if( get_sound_state() == TRUE ) {

        printf("OK!\n");

     }

 

}

 

사용자는,  값이 있으면 TRUE이겠지 라고 충분히 착각할 수도 있습니다.

 

결국, 우리가 정의한 TRUE는 1이기 때문에  123 == 1 비교식에서 실패나겠죠.

 

따라서, 다음과 같이 수정을 해준다면

 

 

void set_sound_state( BOOL state ) {

    //심지어 state가 123 이어도 값을 1로 바꿔줍니다.

    sound_state = !!state;

}

 

자, 이제 만사 OK!


[출처]
 !!a|작성자 Hermet

반응형
Posted by blueasa
, |

간단히 메모리 릭 발생여부를 알아내고 이를 해결하는 방법에 대해서 알아봅시다.

 

이는 MS 사에서 CRT(C Runtime) 라이브러리로 제공해는 CRTDBG 를 이용할 겁니다.

생각보다 쉬운 반면 그 기능은 막강하지요.

 

일단 프로그램 정의부에 다음과 같이 추가합니다.

 

#include <crtdbg.h>

#define CRTDBG_MAP_ALLOC

 

#ifdef _DEBUG

#define new new( _NORMAL_BLOCK, __FILE__, __LINE__ )        //궁금하시면 제 게시글 중 <매크로 마법> 편을 보세요.

#endif

 

이제 메인 진입 부 처음에 다음과 같이 선언합니다. 일반 main() 이라고 가정합니다. 물론 WinMain() 일 수도 있습니다.

 

void main() {

 

    _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

 

    //  .... 메모리를 동적 할당하는 무언가의 작업을 하겠죠

 

}

 

추가로 설명하자면, _CrtSetDbgFlag 설정 비트 필드 값은 다음과 같습니다.

 

_CRTDBG_ALLOC_MEM_DF : 디버그 힙 메모리 할당을 허용합니다. 또한 _CLIENT_BLOCK과 같은 사용자 정의 메모리 블럭을 사용합니다.

 

_CRTDBG_LEAK_CHECK_DF : 프로그램 종료 시 자동으로 메모리 릭을 찾고 이를 출력해 줍니다. 이는 _CrtDumpmemoryLeaks 함수를 호출한 것과 같은 결과입니다.

 

이제 프로그램을 디버그 모드로 실행하고 종료합니다. 만약 동적 메모리 해제를 제대로 안해줬다면 다음과 같은 결과가 결과 화면에 출력됩니다.

 


 

우리에게 필요한 것은 바로 빨간색 선을 그은 정보입니다. 우리는 이 번호를 이용해 메모리 릭이 일어나는 부분을 찾아갈 수 있습니다.

그러나  중요한 점은 똑같은 환경에서 다시 실행했을 때도 메모리 릭 현상 결과가 같아야 한다는 점입니다. 그렇지 않으면, 매번 실행할 때마다 메모리 릭이 발생한 위치가 달라지고 따라서 위 번호도 달라져 버립니다.  따라서, 다른 작업을 하지 마시고 디버깅 작업만 하시길 바랍니다.

 

일단 위 9637 번호를 이용해서 메모리 릭이 일어나는 곳을 찾아가겠습니다. 이제 다시 main 첫부분에 다음과 같이 추가합니다.

 

void main() 

 

     _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF );

    _CrtSetBreakAlloc( 9637 );

 

    //  .... 메모리를 동적 할당하는 무언가의 작업을 하겠죠

 

}

 

그리고 다시 디버그 모드로 실행을 하면 9637에 지시하는 똑같은 메모리 번지를 알아서 브레이크 포인터를 걸어줍니다.

우리는 그 부분의 소스를 보고 콜 스택을 추적해 가면서 메모리 릭을 감지하고 해결할 수가 있죠.

 

이런식으로 출력창에 출력되었던 다른 메모리 릭도 모두 찾아 해결하시면 됩니다.

 

 

릴리즈 배포 전, 메모리 책임은 프로그래머의 미덕이지 않을까요?

 

 

 

- 참고 : MSDN -


 
[출처] C Runtime 환경의 메모리 릭 잡는 방법 ( Memory Leak )|작성자 Hermet

반응형
Posted by blueasa
, |

1. 개요

_CrtDumpMemoryLeaks() 라는 함수를 이용해서 메모리 누수와 누수 지점을 알아내는 기법을 알아본다.

 

2. 탐지하기


#define CRTDBG_MAP_ALLOC


#include <crtdbg.h>

 

void main()

{

   char *ptr = new char[20];

 

   _CrtDumpMemoryLeaks();

}

 

 

 

여기서 {100} 라는 숫자를 보자...

{100 } 이라는 위치에서 할당받은 메모리가 해제가 안된체로 남아있다는 말이기 때문에 그위치에서 브래이크걸도록 만들면

원인을 일으킨 위치를 알아낼수있다.

 

 

void main()

{

  _CrtSetBreakAlloc(100);

  

  char *ptr = new char[20];

 

   _CrtDumpMemoryLeaks();

}

 

 

CrtSetBreakAlloc함수를 시작위치에 두고 다시 컴파일 하여 실행을 시켜보자.

 


 

 

  char *ptr = new char[20]; 위치에서 브래이크 걸릴것이다.

 

이런식으로 메모리 누수를 잡아낼수있다.

 

 

 

 

3. 주의사항

 

mfc용 어플리캐이션은 자동으로 메모리 누수 탐지가 되지만 일반 원도우 어플이나 콘솔어플은 이방법을 사용 해야만 메모리 누수를 알수있다.

 

_CrtDumpMemoryLeaks(); 가 호출되는 시점에서 해제 안된 메모리를 덤프하므로 꼭 프로그램 종료 직전에 써줘야 정확한 메모리 누수여부를 알수잇다.

 

_CrtDumpMemoryLeaks();

delete somePtr;

 

이렇게 되면 메모리 릭이 덤프된다.

 

또한

STL 사용시 제데로 릭을 검출 하지못하고 무조건 메모릭으로 판단하는 경우가 있다.

 

void main()

{

  std::string str("http://jga.or.kr");
  _CrtDumpMemoryLeaks(); 
}

 

이코는 문제가 없지만 str이 아직 중괄호 범위를 벋어나지 않았으므로 여전히 해제가 안된것으로 간주하여 메모릭으로 출력한다.

 

이때는 ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 를 사용해서 릭을 검출할수있다.

 

void main()

{

  ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);

  std::string str("sasa");

  char *ptr = new char[20];

  
  //_CrtDumpMemoryLeaks(); 
}

이렇게 해주면 str에 대해서는 메모리릭이 발생하지않는다.


출처 : http://cafe.naver.com/jcga/883

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

아래는 해결방법을 찾아다니다 데브피아에서 발견한 글입니다.

[증상]
OS : Win7 x64
프로그램 : VS2008 x86으로 제작

프로그램을 만들어서 배포를 했는데 팀원(Win7 x64)의 컴퓨터에서 side-by-side 에러 어쩌고 하면서 실행이 안됐습니다.

그래서 열심히 검색하다가 데브피아에서 아래와 같은 글을 발견했는데..

아래 글을 보고 생각하다보니 Win7 x64에서 자동업데이트를 해봤자 재배포 패키지가 x64만 깔린다는 생각이 들어서

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트 x86 버전을 받아서 직접 깔았더니 잘 실행 되네요.

아래 글이 도움 많이 됐습니다. =ㅅ=

Microsoft Visual C++ 2005 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?FamilyID=766A6AF7-EC73-40FF-B072-9112BAB119C2

Microsoft Visual C++ 2008 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=8B29655E-9DA4-4B6B-9AC5-687CA0770F93&displaylang=ko

Microsoft Visual C++ 2008 서비스 팩 1 재배포 가능 패키지 ATL 보안 업데이트
http://www.microsoft.com/downloads/ko-kr/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=ko





VC 2005,2008 ATL관련 보안업데트가 있습니다.

일단 설치를 보류하세요.

자동업데이트도 막으십시요.

 

 

전 2008을 사용중인데. 어제 VC관련 업데이트가 떴길래 무심코 업데이트를 했습니다.

그리고 오늘 수정건을 업체에 배포했는데 죽어도 실행이 안되길래

따로 테스트를 해보았습니다.

 

결론부터 말씀드리면 업데이트3건은

2005, 2008 재배포 패키지(sp1일경우는 따로..) 관련

vs 2008관련

3가지가 설치되는데요.

 

이게 배포시 기본 2008하고 sp1이 다르듯이 아예 재배포 패키지가 다릅니다.

즉 dll버젼이 다르죠.

 

2008 기본 버젼이 9.0.21022.8이고

sp1이 9.0.30729.1

이번 업데이트로 (sp1) 9.0.30729.4148

 

dll버젼이 달라서 재배포 패키지를 최신버젼으로 다시 설치해야됩니다.

 

여기서 젤큰 문제 세가지는

1. 2005,2008 재배포 관련 설치는 추가/제거에 존재하는데 삭제해도 똑같다.

-> vs 2008 sp1관련 업데이트 삭제가 없다.

 

2. 윈도우 복원을 했는데요. 똑같이 문제가 발생하더란 겁니다.

-> 설치된 목록에도 없고 업데이트 해달라고 떡하니 뜨는데도 말이죠;

 

3. 2005부터 재배포 패키지로 바뀌었지만 설치된 폴더에서 필요한 몇개의 파일만 같이 포함하면

문제없었는데 이번엔 아예 그게 안먹힙니다. 제결론으로 그 이유는

 

manifest 명시를 보면

 

기존 sp1을 보면(mfc사용시)

 

 <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>

 

9.0.30729.1 버젼의 crt와 mfc라이브러만 명시되어 있지만

 

이번 업데이트로는

  <trustInfo xmlns="urn:schemas-microsoft-com:asm.v3">
    <security>
      <requestedPrivileges>
        <requestedExecutionLevel level="requireAdministrator" uiAccess="false"></requestedExecutionLevel>
      </requestedPrivileges>
    </security>
  </trustInfo>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.MFC" version="9.0.30729.4148" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>
  <dependency>
    <dependentAssembly>
      <assemblyIdentity type="win32" name="Microsoft.VC90.CRT" version="9.0.30729.1" processorArchitecture="x86" publicKeyToken="1fc8b3b9a1e18e3b"></assemblyIdentity>
    </dependentAssembly>
  </dependency>

 

9.0.30729.1과 9.0.30729.4148 CRT를 둘다 필요로 합니다. 고로 9.0.30729.4148 dll만 포함하면 실행이 안되겠죠.

 

결론.

아직 정확한 문서를 못봐서 atl관련 뭐가 업데이트 됐는진 모르지만 설치하지마세요 ㅡ.ㅡ;

이미 설치하셨다면 업데이트된 pc에서 컴파일한 파일 배포시는 재배포 패키지를 바꿔야합니다.

아예 모든 재배포 패키지를 최신꺼로 바꿔야합니다;

 

 

sp1용 재배포 패키지 주소 올려드립니다. 한글로는 아직검색 안되는듯 하네요.

Microsoft Visual C++ 2005 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

 

Microsoft Visual C++ 2008 Service Pack 1 Redistributable Package ATL Security Update

http://www.microsoft.com/downloads/details.aspx?familyid=2051A0C1-C9B5-4B0A-A8F5-770A549FD78C&displaylang=en

 

 

제가 겪은 일을 일단 빨리 올려봅니다.

댓글로 잘못된 부분은 알려주세요.

업데이트된 내용도 올려주심 감사.


출처 :  http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=51&MAEULNo=20&no=8351&ref=8351

반응형
Posted by blueasa
, |
반응형
Posted by blueasa
, |

메모리 릭 잡기

Tip & Tech / 2011. 5. 9. 02:09

//_CrtSetBreakAlloc( 11698 );
 _CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_DELAY_FREE_MEM_DF );

 

간단하다. 이거 맨위에 추가해 주자

 

만약 라인수가 나온다면, 주석 처리 된 부분의 숫자를 그 라인으로 바꿔준다.

 

그리고 다시 실행하면 해당 부분에서 브레이크가 걸린다.

 

간단한 건데, 자꾸 까먹어서 메모해 둔다



[출처]
 메모리 릭 잡기|작성자 시네루진

반응형
Posted by blueasa
, |

디버거로 프로그램 실행 도중 변수 값 조정 방법

 

작성자 : 최흥배 ( jacking75@gmail.com )
 

이 기법은 Game Coding Complete ”라는 책에서 디버깅 기법 중 하나로 소개되고 있는 기법으로 프로그램을 디버깅 모드로 실행하면서 어떤 변수의 값을 변경하 여그 결과를 바로 알고 싶을 때 아주 좋다.

일반적으로 UI 작업 같은 것을 해보면 컨트롤 등의 위치를 바르게 잡기 위해 위치 값을 변경하면서 컴파일->실행->수정->컴파일 단계를 반복하면서 정확한 값을 알아내기 때문에 상당한 시간과 짜증이 유발 된다.

이외에 데이터 주도방식으로 프로그래밍 해도 되지만 이것도 데이터변경->실행 단계를 계속 반복 해야 되기 때문에 UI 노가다 작업이 만만치 않을 것이다.

그러나 지금 소개하는 기법을 사용하면 아주 손쉽고 바로 그 결과를 알 수 있다.


 

이 기법을 사용 하려면 static 변수를 사용하여 디버깅 시 static 변수를 사용하는 부분에 브레이크 포인트를 걸고 변수를 조정하면 된다.



위의 그림을 보면 static 변수 nn0에 값을 설정 한 후 이 값을 사용하는 280 라인에 브레이크 포인트를 걸어 놓는다.

그런 후 디버깅 시에 280 라인에서 프로그램이 멈추면 디버깅 창의 “자동(Watch) ”창에서 nn0 변수를 찾은 후 값을 원하는 값으로 변경한다.




nn0의 값은 원래는 53 이었으나 이제 60으로 변경 되어 이후 60으로 설정 되어 프로그램에서 사용된다.


 

위 그림의 코드를 보면 알겠지만 위 코드는 화면에 글자를 찍기 위한 코드인데 화면에서 글자를 찍을 때 위치에 맞게 하기 위해서 x,y 좌표를 변경하면서 결과를 바로 보기 때문에 아주 빠르고 쉽게 작업이 된다.

출처 : 
http://jacking.tistory.com/301

 

반응형
Posted by blueasa
, |