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

카테고리

분류 전체보기 (2809)
Unity3D (865)
Programming (479)
Server (33)
Unreal (4)
Gamebryo (56)
Tip & Tech (234)
협업 (61)
3DS Max (3)
Game (12)
Utility (140)
Etc (98)
Link (32)
Portfolio (19)
Subject (90)
iOS,OSX (55)
Android (16)
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

Visual C++ (.NET 기준)에서 디버깅 시 유용하게 사용할 수 있는 컴파일옵션들을 정리해 보았습니다.  하나하나 다 외우질 못해 프린트해서 그때그때 사용하고 있습니다. ^^

도움이 될 지 모르겠네요.

 

/EP /P C/C++ Preprocessor Generate Preprocessed File
(파일전처리)
전처리 코드에 대한 내용을 소스파일.i 파일로 볼 수 있다. 
/C C/C++ Preprocessor Keep Comments
(주석유지)
위를 설정하고 이것도 설정하면 선택하면 전처리코드 위의 주석도 유지하면서 보여 줄 것이다.
/X C/C++ Preprocessor Ignore Standard Include Path
(표준 포함경로무시)
표준 인클루드 경로 무시
/Zp C/C++ Code Generation Struct Member Alignment
(구조체 맴버 맞춤)
#pragma pack 지시자를 사용하는 것이 더 좋을 것 같다.
/Wp64 C/C++ General Detect 64-bit Portability Issues
(64비트 이식성 문제 검색)
나중 64비트 호완성을 돕기위해 설정을 해 두는 것이 좋다.
/RTC C/C++ Code Generation Smaller Type Check
(작은 형식 검사)
/RTCc : 값을 작은 데이터 형식으로 변환할 때 데이터손실이 없는 지 검사한다.
Basic Runtime Checks
(기본 런타임 검사)
/RTCu : 초기화되지 않은 변수참조를 추적한다.
/RTCs : 모든 지역변수들을 0xCC로 초기화 하여 훌륭한 스택 프레임 검사가 로컬변수 언더런과 오버런을 감지하고 스택 충돌에 대해서 스택 포인터를 검증하도록 한다.
/RTCsu : 위의 두개 모두 포함
/GS C/C++ Code Generation Buffer Security Check
(버퍼 보안 검사)
바이러스 작성자들의 가장 일반적인 공격인 리턴주소를 악성코드로 리다이렉트 할 수 있도록 하는 버퍼오버런공격을 막아주는 것이다.
/O(num) C/C++ Optimization Optimization
(최적화)
/O1(크기최소화), /O2(속도최대화:디폴트)
마이크로소프트 제품은 모두 /O1으로 컴파일..이것으로 컴파일 할 때 같이 SWS(Smooth Working Set)유틸리티를 사용해서 공통적으로 사용하는 함수들을 앞으로 배치되도록 해야 한다.(속도도 높이기 위해)
/GL Main General Whole Program Optimization
(전체프로그램최적화)
설정하면 링커스위치에 /LTCG(밑에 참조 바람)를 설정
/showincludes C/C++ Advanced Show Includes
(포함 파일 나열)
컴파일 할 때 포함되는 include 파일들이 어떤 위치의 것인지를 Output 화면으로 모두 보여준다.
/MAP Linker Debugging Generate Map File
(맵파일 생성)
맵파일을 생성하는 스위치로 유용한 정보를 얻기위해서는 모두 사용해야 한다.
/MAP:LINES Linker Debugging Map Lines
(맵파일에 줄 번호 정보 포함
/MAP:EXPORTS Linker Debugging Map Exports
(맴파일에 익스포트 함수정보 포함)
/NODEFAULTLIB Linker Input Ignore All Default Libraries
(라이브러리 무시)
많은 시스템 헤더파일들이 어떤 파일이 링크되는지 지정하기 위해 #pragma comment (lib#,립이름)을 포함하는데 이를 모두 무시하도록 지시한다.
/OPT:NOWIN98 Linker Optimization Optimize for Windows98
(Windows98에 맞게 최적화)
98,ME를 지원하지 않는 다면 설정하는 것이 좋다. 응용프로그램의 크기를 줄일 수 있다.
/ORDER Linker Optimization Function Order
(함수에 순서 지정)
SWS(Smooth Working Set) 을 실행한 후 함수의 순서를 포함하고 있는 파일을 지정할 수 있다.
/VERBOSE Linker General Show Process
(진행 메시지 표시)
링크되는 라이브러리의 모든 진행 메세지를 표시
/VERBOSE:LIB Linker General Show Process
(진행 메시지 표시)
검색된 라이브러리만 나타내는 진행 메세지를 표시
/LTCG Main General Whole Program Optimization
(전체프로그램최적화)
/GL스위치와 짝을 이룬다. 링크시간코드를 생성.
/RELEASE Linker Advanced Set Checksum
(체크섬 설정)
별로 사용되지 않지만 WinDBG를 사용할 때 책섬을 조사할 때 필요하기 때문에 미리 넣어 두는 게 좋다.
/PDBSTRIPPED Linker Debugging Strip Private Symbols
(전용 기호 제거된 심볼)
스택을 탐색하고 해독하기 위해서 필요한 특별한 Frame Pointer Omission(FPO) 데이터를 PDB파일에 포함시키기 위해 설정한다. 각종 변수나 소스 줄정보는 빼고 필요한 FPO데이터와 공용함수들만 남겨놓는다(stripped PDB파일). 이것과 함께 일반 PDB 파일을 같이 생성할 수 있다. 나중에 Dr.Watson 등에서 PDB파일을 로드할 수 있기 위해서는 파일명을 어플리케이션 명과 같게 해줄 필요가 있다.

반응형
Posted by blueasa
, |

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

//VC++의 출력창을 이용한 디버깅 수단1

#include <Windows.h>

//void main()...

OutputDebugString(msg);                                         //VC출력창에 문자가 출력 된다.

 

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

//별도의 Console창을 이용한 디버깅 수단2

//void main()...

AllocConsole();                                                             // 콘솔창 만든다.

char strBuffer[256]="";

DWORD(또는 size_t) dwWrite;
HANDLE m_hOut = GetStdHandle(STD_OUTPUT_HANDLE);                            // 콘솔창의 핸들 가져옴.
WriteConsole(m_hOut, strBuffer, strlen(strBuffer), &dwWrite, NULL);// 콘솔창에 쓸때
FreeConsole();                                                              // 콘솔창을 없앰.

 

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

//별도의 Console창을 이용한 디버깅 수단3

#include <stdio.h>                                                        //또는 #include <iostream>

//void main()...

AllocConsole();

freopen("CONOUT$", "wt", stdout );                       //이것을 사용하면 출력함수 사용이 가능하다

printf("");                                                                        //또는 std::cout << "";

FreeConsole(); 

 

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

 //별도의 Console창을 이용한 디버깅 수단4

//단 WinMainCRTStartup은 컴파일이 되기전에는 생성되지 않으므로 컴파일 후 삽입해주자
 #pragma comment(linker, "/entry:WinMainCRTStartup /subsystem:console")

#include <stdio.h>                                                          //또는 #include <iostream>

//void main()...

printf("");                                                                         //또는 std::cout << "";

 
쉽고 간단한 방법이라면 1번 방법과 3번 방법이 젤 좋아 보인다.
그중에서 3번이라면 C++ 기초문법 중 하나처럼 별도의 랩핑이나 (기능)클래스 생성 없이
출력창에 간단히 로그를 남길 수 있어 편할 듯 하다.
반응형
Posted by blueasa
, |

유용한 전처리기

Tip & Tech / 2011. 1. 7. 03:13

전처리기.

프리컴파일러(Free가 아니다 : PreCompiler)

 

프로그래머들이 자주 쓰는 전처리기 기능 3가지만 소개하고자 한다.

이것은 쓰라고 강요하기보단 다른 사람(그사람이 현업에서 근무할 가능이 높으므로) 코드를 이해하는데

조금이나마 도움을 주기 때문이다.

 

#pragma comment()

 

ex)

#pragma comment(lib, "dxguid.lib")

 

Project -> Setting -> Link(단축키:ALT+F7)에서 "dxguid.lib"와 "ddraw.lib"와 같은 lib파일을

링크해야 하는 과정을 대신해준다.

 

#pragma warning ()

 

ex)

#pragma warning (disable:4244)

 

4244의 경고 메세지를 출력창에 안보이도록 해준다.

참고로 4244는 무리한(캐스팅연산자가 없이하는) 형변환에 대한 경고이다.

 

#pragma message()

 

ex)

#define _QUOT(x) # x
#define QUOT(x) _QUOT(x)
#define OutputMessage(x)  message( __FILE__ "(" QUOT(__LINE__) ") : " #x )

 

void main()

{

  #pragma OutputMessage(하하하)

}

 

위모양대로 했을경우 컴파일러 출력창에 메세지를 출력해주며 파일과 라인번호를 입력하면

에러났을때 처럼 링크기능이 있다.

cpp의 컴파일 순서를 체크(물론 VC에서는 이에 해당하는 기능도 제공한다)해볼때 유용할거 같다.

[출처] 유용한 전처리기|작성자 나르메

반응형
Posted by blueasa
, |

Gamebryo 셋팅

Gamebryo/Lecture / 2011. 1. 6. 20:45

*게임브리오 설치 전에 VS 2005를 사용시 반드시 서비스팩1를 설치 

(매니패스트 관련 에러가 난다면 버그로 인해 재배포가 안되어서 에러가 나는 것이므로 꼭 패치해야 한다.)

- 추가 라이브러리

NiMesh.lib NiApplication.lib NiSystem.lib NiMain.lib NiInput.lib NiFloodgate.lib NiDx9Renderer.lib NiAnimation.lib

 

*시작

1. Win32API Project로 생성 3DProject로 설정 (빈프로젝트 생성)

2. 클래스 추가->c++클래스 추가 -> base class에 NiApplication등록-> classname은 CGameApplication

3. #include "NiApplication.h" 추가 // 게임브리오 프레임워크

4. 프로젝트 속성 -> 문자집합을 '유니코드' 설정되어 있는것을-> '설정안함'으로 설정

 

 

5. 프로젝트 속성 -> C/C++ -> 64비트 이식성 문제점 검색 -> '아니오' 설정

 

 

6. C/C++ -> 추가포함 디렉터리 -> 자신이 설치한 include폴더로 지정

7. C/C++ -> 전처리기 -> 전처리기 정의 ->WIN32;_DEBUG;_WINDOWS;NIDEBUG;STRICT 추가 

8. 링커 -> 추가라이브러리 디렉터리 -> 자신이 설치한 debuglib폴더로 지정

9. 링커 -> 입력 -> 추가 종속성 -> 위의 추가라이브러리 설정

   NiMesh.lib (메쉬), NiApplication.lib(프레임워크), NiSystem.lib(게임브리오 전반적 시스템), NiFloodgate.lib(Util),

   NiMain.lib(Base), NiInput.lib(input), NiDx9Render.lib(D3D9)

 

10. 도움말 확인

 

 

 이것을 생성한 class에 추가

11. 게임브리오 라이센스를 선언해 주어야 한다.

 #include <NiLicense.h>
NiEmbedGamebryoLicenseCode;

12. 생성한 NiApplication NiApplication::Create()에

     return NiNew CGameApplication; 으로 추가

     NiApplication* NiApplication::Create()
    {
    /*
     new -> NiNew
     delete -> NiDelete
    */
     return NiNew CGameApplication; 
     }

13. 생성한 클래스의 생성자에게 : NiApplication 생성자 추가후

    CGameApplication::CGameApplication(void)
    : NiApplication("Game ver 0.1", DEF_SCREEN_WIDTH, DEF_SCREEN_HEIGHT)

 

* 잠시! 헤더에 대한 설명

NiApplication.h

: public NiMemObject 가 하고 있다. -> 게임브리오가 질접적으로 메모리를 관리하기 위해 사용되고 있는 것

NiRefObject.h

: 참조를 관리해주는 것으로 이것을 상속받고 있는건 참조에 따라 자동삭제를 하기 위해서임(게임브리오에서 쓰는 스마트포인터 같은..)

NiMeshScreenElements.h

: 2D관련해서 작성할 때 추가

NiMesh.h

: 3D관련

 

*슈핑모드 만들기

1. 구성관리자 -> 새로만들기

 

2. 새 솔루션 구성

 

3. 전행처리기

 

4. lib폴더를 shipping으로 추가

 

5. 헤더는 기본헤더로

 

=> shipping모드는 debug 모드보다 더 가볍다.

 

* 직접 초기화 하기(Dx Device Create)

 

 

직접 초기화 하기 위해 CreateRender() 함수를 상속받아와서 아래 코드를 작성한다.

bool CGameApplication:::CreateRenderer()
{
 unsigned int uiWidth = m_pkAppWindow->GetWidth();
 unsigned int uiHeight = m_pkAppWindow->GetHeight();

 m_spRenderer = NiDX9Renderer::Create(uiWidth, uiHeight,
  NiDX9Renderer::USE_NOFLAGS, GetWindowReference(), 
  GetRenderWindowReference());

 if (m_spRenderer == NULL)
 {
  NiMessageBox("Unable to create a renderer!", "Renderer Failure!");
  QuitApplication();
  return false;
 }
 return true;
}

단, #include <NiDX9Render.h>를 추가해야 한다.

이렇게 하면 앞에서 한 예제와 다르게 다이어로그가 뜨면서 어떤 형식으로 실행할 것인지 물어보지 않는다.

왜냐하면 직접 DX로 한다고 선언했기 때문에..

- 다이어로그 뜰때

 

* 중요한 m_spRendere!

DX 디바이스 가져오기

//--직접적으로DirectX를제어하고싶을때

             NiRenderer* renderer = m_spRenderer;

             NiDX9Renderer* pDX9Renderer  = ((NiDX9Renderer*)renderer);

             LPDIRECT3DDEVICE9 pp =pDX9Renderer->GetD3DDevice();

 

-> 스마트 포인터 때문에 NiRenderer* 포인터로 한번 받아온다.


출처 : http://blog.naver.com/fantaldh/40067964992

[출처] Gamebryo 셋팅|작성자 대봉이

반응형

'Gamebryo > Lecture' 카테고리의 다른 글

무기잔상효과  (0) 2011.02.08
캐릭터 기울기 연산  (0) 2011.02.08
게임브리오 강좌(?) 링크  (3) 2010.04.14
Gamebryo 2.5  (0) 2010.04.12
[링크] 게임브리오 강좌  (0) 2010.04.10
Posted by blueasa
, |

VS도움말에도 나와있는 내용이지만 프로젝트가 거대해지면 어쩔 수 없이 헤더파일이 이리저리 엉키고 중복선언하게되는데, 그렇게되면 잘 작동하던 Intellisense가 갑자기 작동하지 않고 상태표시줄에 아래와 같은 메시지가 뜨는 것을 볼 수가 있다.

그림 1 : 에러메시지. (Intellisense가 정상작동하는데도 .또는 ->가 뒤바뀌어서 같은 메시지가 뜨는 경우도 있다. )

 

사실 아래와 같은 Intellisense가 뜨는게 정상인데 말이다.

그림 2 : Intellisense

이럴 땐 VS를 종료하고 프로젝트폴더 안을 보면 프로젝트명.ncb의 파일이 존재하는데 가차없이 삭제해주고 VB를 재실행하면 해결된다.

 

(레퍼런스)----------------------------------------------------------------------

Visual Studio 도움말

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

반응형
Posted by blueasa
, |

#################
 컨테이너 종류
#################

표준 STL 시퀀스 컨테이너 : vector, string, deque, list
표준 STL 연관 컨테이너 : set, multiset, map, multimap

비표준 시퀀스 컨테이너 : slit, rope
비표준 연관 컨테이너 : hash_set, hash_multiset, hash_map, hash_multimap

string 대한 vector<char>

표준 연관 컨테이너 대신 사용 되는 vector

STL에 속하지 않는 표준 컨테이너 : 배열, bitset, valarray, stack, queue, priority_queue

-------------------------
 연속 메모리 컨테이너
-------------------------
삽입 삭제시 메모리가 밀려 지거나 땡겨 지는 컨테이너(무효화!!! <-- 특히 이넘을 조심 해야 함.)
vector, string, deque.

---------------------
 노드 기반 컨테이너
---------------------
삽입 삭제시 메모리 포인터만 영향을 받음. 밀리는 현상 없음.
list, slist, set, multiset, map, multimap,
hash_set, hash_multiset, hash_map, hash_multimap


#######################################
STL은 복사에서 시작 하고 복사로 끝난다.
#######################################
값을 얻거나 넣거나 할때 모두 복사로 이루어 집니다.

상속된 클래스를 사용할 경우 베이스 클래스로 형 지정 했다면,
복사라는 특징 때문에 상속된 클래스는 잘리게 됩니다.(slicing problem)

이에 대한 해결 책은 클래스 포인터를 사용 하는 것입니다.(추후 설명)


배열
T w[maxT];

사이즈 0
vector<T> vw;

max T 만큼 미리 확보
vector<T> vw;
vw.reserve(maxT);


######################################
size() == 0을 쓰지 말고 empty()를 써라
######################################

size()를 제공 하지 않는 것도 있다. 예 list


######################################
단일 요소 반복 대신 범위 함수를 쓰자
######################################

void container::assign(시작, 끝)

void container::contrainer(시작, 끝)

void container::insert(삽입위치, 삽입 시작, 끝)

iterator container::erase(시작, 끝)     - 시퀀스 컨테이너

void container::erase(시작, 끝) - 연관 컨테이너(반복자의 반환으로 성능 저하 되므로...)


#####################
C++의 어이 없는 동작
#####################

 

#include <iostream>

class T {
public:
        T() { cout << "ok" << endl;}
};

int main() {
        T t1(); // 함수 선언, nothing...

        T t2;   // t 객체 생성, out "ok"
}

같은 원리로...

ifstream dataFile("ints.dat");
list<int> data(istream_iterator<int>(dataFile), istream iterator<int>());       // 단순한 함수 선언에 불과 하다.

list<int> data((istream_iterator<int>(dataFile)), istream iterator<int>());     // 해결, 범용성 떨어짐

<해결>
ifstream dataFile("ints.dat");
istream_iterator<int> dataBegin(dataFile);
istream_iterator<int> dataEnd;
list<int> data(dataBegin, dataEnd);


############################################################################
new로 생성한 포인터 컨테이너는 컨테이너가 소멸 되기 전에 포인터를 delete하자
############################################################################


vector<Widget *> vwp;

for(int i=0; i<NUM; ++i) {
        vwp.push_back(new Widget);      // new로 생성
}

//... 사용

for(vectro<Widget *>::iterator i = vwp.begin(); i!=vwp.end(); ++i)
        delete *i;              // delete로 소멸


<문제>
1. for루프는 for_each보다 명확하지 못하다.
2. 사용 중에 vwp가 예외를 던진 다음 메모리 누수 문제는 여전히 남는다.

<1번 해결>
struct Delete Object {
        template<typename T>
        void operator()(const T*ptr) const {
                delete ptr;
        }
};

for_each(vwp.begin(), vwp.end(), DeleteObject());

<2번 해결>
www.boost.org의 스마트 포인터 라이브러리를 사용 합니다.

void doSomething()
{
        typedef boost::shared_ptr<Widget> SPW;

        vector<SPW> vwp;

        for(int i=0; i<NUM; ++i)
                vwp.push)back(SPW(new Widget));
        ...
}

doSomething()함수가 끝나더라도, 예외가 발생 해도 메모리가 새지 않습니다.


##############################
auto_ptr 은 절대로 쓰지 말아라
##############################
auto_ptr은 스마트 포인터가 아니다. 자세한것은 Effective STL 참조!!!


##################
삭제의 조심 스러움
##################

무효화된 i에 대하여 ++i를 하고 있다.


AssocContainer<int> c;  // AssocContainer는 연관 컨테이너.
...
for(AssocContainer<int>::iterator i=c.begin(); i!=c.end(); ++i) {
        if(badValue(*i)) c.erase(i);
}

<해결>
AssocContainer<int> c;
...
for(AssocContainer<int>::iterator i=c.begin(); i!=c.end(); ) {
        if(badValue(*i)) c.erase(i++);
        else ++i;
}


연속 컨테이너인 경우 i++시 전체가 무효화 됩니다.

<해결>
for(SeqContainer<int>::iterator i=c.begin(); i!=c.end();) {
        if(badValue(*i)) {
                i = c.erase(i);
        }
        else ++i;
}


######################################################
STL 쓰레드는 쓰레드에 안전하지 않다.(직접 관리 해야함)



출처 : http://blog.naver.com/jinowin/6000269089

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

sendmessage in C#

Programming/C# / 2010. 12. 27. 01:42
1         [DllImport("user32.dll", SetLastError = true)]  
2         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
3  
4         [DllImport("user32.dll", SetLastError = true)]  
5         static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);  
6  
7         [DllImport("user32.dll")]  
8         private static extern bool PostMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);  
9  
10         static void Main(string[] args)  
11         {  
12             // Use this to send key strokes  
13             const int WM_KEYDOWN = 0x100;  
14             IntPtr windowHandle = FindWindow("NOTEPAD"null);  
15             IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT"null);  
16             PostMessage(editHandle, WM_KEYDOWN, 'A', 0);  
17             Console.ReadKey();  
18         }

1         [DllImport("user32.dll")]  
2         public static extern int SendMessage(int hWnd, int msg, int wParam, [MarshalAs(UnmanagedType.LPStr)] string lParam);  
3  
4         [DllImport("user32.dll", SetLastError = true)]  
5         static extern IntPtr FindWindow(string lpClassName, string lpWindowName);  
6  
7         [DllImport("user32.dll", SetLastError = true)]  
8         static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpszClass, string lpszWindow);  
9  
10         static void Main(string[] args)  
11         {  
12             const int WM_SETTEXT = 0x0C;  
13  
14             IntPtr windowHandle = FindWindow("NOTEPAD"null);  
15             IntPtr editHandle = FindWindowEx(windowHandle, IntPtr.Zero, "EDIT"null);  
16             string textToSendToFile = "Input here your text";  
17             SendMessage((int)editHandle, WM_SETTEXT, 0, textToSendToFile);  
18  
19             Console.ReadKey();  
20         }


반응형
Posted by blueasa
, |

C# SendMessage Keypress

Programming/C# / 2010. 12. 26. 23:45
#region Function Imports
 
       
[DllImport("user32.dll")]
       
public static extern IntPtr FindWindow(string lpClassName, string lpWindowName);
 
       
[DllImport("user32.dll")]
       
static extern int SendMessage(IntPtr hWnd, int msg, int wParam, int lParam);
 
       
#endregion
 
       
#region Constants
 
       
// Messages
       
const int WM_KEYDOWN = 0x100;
       
const int WM_KEYUP = 0x101;
       
const int WM_CHAR = 0x105;
       
const int WM_SYSKEYDOWN = 0x104;
       
const int WM_SYSKEYUP = 0x105;
 
       
#endregion
 
       
public static void SendKey(string wName, Keys key)
       
{
           
IntPtr hWnd = FindWindow(null, wName);
 
           
SendMessage(hWnd, WM_KEYDOWN, Convert.ToInt32(key), 0);
           
SendMessage(hWnd, WM_KEYUP, Convert.ToInt32(key), 0);
       
}
 
       
public static void SendSysKey(string wName, Keys key)
       
{
           
IntPtr hWnd = FindWindow(null, wName);
 
           
SendMessage(hWnd, WM_SYSKEYDOWN, Convert.ToInt32(key), 0);
           
SendMessage(hWnd, WM_SYSKEYUP, Convert.ToInt32(key), 0);
       
}
 
       
public static void SendChar(string wName, char c)
       
{
           
IntPtr hWnd = FindWindow(null, wName);
 
           
SendMessage(hWnd, WM_CHAR, (int)c, 0);
       
}


반응형
Posted by blueasa
, |

C# 배움터

Link / 2010. 12. 23. 17:09
반응형

'Link' 카테고리의 다른 글

Gamebryo 관련 사이트  (0) 2011.01.21
Programmers united develop net  (0) 2011.01.10
Download D3DX DLLs (d3dx9_xx.dll, d3dx10_xx.dll)  (0) 2010.12.23
종이천하  (0) 2010.12.20
Dot Net Perls  (0) 2010.11.08
Posted by blueasa
, |