출처 : http://www.pdfpro.co.kr/blog/jeong/8

 

여러분의 팀에서는 일일빌드를 하고 있습니까? 아주 새로운 개념도 아니고, 별다를 것도 없는 것이지만 몇 년 전 국내에 조엘 온 소프트웨어가 알려지면서 많은 개발자들의 관심을 받고 있습니다.

 

일일빌드는?


일일빌드는 다음과 같은 장점이 있습니다.

 

1.     테스트팀 또는 마케팅 부서에서 언제나 최신 버전의 제품에 접근할 수 있게 해 줍니다. 이는 버그트래킹 시스템과 연계해 사용할 경우 더욱 큰 장점이 됩니다. 개발자가 어떤 버그 또는 이슈를 해결하면, 버그트래킹 시스템에 해결 표시를 하게 됩니다. 이를 확인한 테스터는 최신 버전의 릴리즈를 이용해 해결 여부를 쉽게 확인할 수 있습니다.

2.     좀더 신중한 체크인을 가능하게 해 줍니다. 개발자가 빌드가 되지 않는 상태에서 소스코드를 체크인을 하거나, 새로 추가된 파일을 체크인 하지 않으면, 팀 전체가 작업을 할 수 없는 상황이 벌어진다. 자동화된 일일빌드는 이러한 상황을 빨리 알 수 있게 해 준다.

3.     일일빌드의 로그와 바이너리를 보관하면 예전의 버그가 새로 발생하는 등과 같은 문제를 쉽게 해결할 수 있다. 보관된 바이너리에서 이진검색을 하면 최대 log n (n은 로그의 개수)만에 문제가 된 수정을 체크인을 추적할 수 있다.

 

이 외에도 여러 장점들이 있겠지만, 아직 일일빌드 시스템이 만들어지지 위한 팀에서 쉽게 일일빌드 시스템을 구축할 수 있도록 실용적인 이야기들을 하려 합니다.

 

일일빌드 시스템 구축하기

 

1.     먼저 버전 컨트롤 시스템을 사용하고 있어야 합니다. 아직도 버전 컨트롤을 하지 않고 있으시다면, 당장 구축 하시기를 추천합니다. 저희 회사에서는 오픈 소스인 Subversion을 사용하고 있습니다.

2.     빌드를 위한 하드웨어가 필요합니다. 부득이한 경우 개발자가 사용하고 있는 워크스테이션을 사용할 수도 있겠지만 아무래도 불편하겠지요? 빌드 전용 장비를 장만하시던가 여의치 않으면, 성능 좋고 바쁘지 않은 사내 서버를 이용하시면 됩니다. 물론 이 기계에 개발 환경을 똑같이 마련할 수 있어야 합니다.

3.     이제 일일 빌드를 수행하는 스크립트를 작성합니다. 스크립트는 윈도우 환경이라면 배치 파일도 좋고, 유닉스 환경이라면 쉘스크립트를 이용하면 됩니다. 더 정교한 제어를 위해서라면 Perl 또는 Python도 좋습니다. 스크립트의 내용은 1) 최신 버전의 코드를 체크아웃 합니다. 2) 모든 프로젝트를 컴파일 하고 링크하여 바이너리를 만듭니다. 3) 필요하다면 설치 패키지(인스톨러)를 빌드 합니다. 4) 빌드 결과를 이메일 등과 같은 방법으로 모든 팀원들에게 알려 줍니다.

4.     스크립트를 테스트 해 봅니다.

5.     스크립트가 성공적으로 만들어 졌다면, 윈도우 스케줄러나 유닉스의 cron 등을 이용해 주기적으로 실행되도록 합니다. 비록 일일빌드이지만 최소 하루에 한번, 가능하다면 자주 해 주는 것이 좋습니다.

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

출처 : http://blog.naver.com/oranke/40014299102

 

일반 어플리케이션을 서비스로 등록하기

 

일반 어플리케이션을 서비스로 만들어두면 오류시 재시동 등을 OS가 알아서 해주는 등 많은 장점이 있다. 이 짧은 글에서는 서비스로 만들 것을 고려하지 않은 게임서버 어플리케이션을 서비스로 등록하는 방법에 대해 정리해 본다.

 

먼저 instsrv.exe 와 srvany.exe 두 개의 파일이 필요하다. 이 파일들은 윈도 리소스킷에 들어있으니 다음 위치에서 다운받아 설치하자.

 

http://www.microsoft.com/downloads

http://www.microsoft.com/downloads/details.aspx?FamilyID=9d467a69-57ff-4ae7-96ee-b18c4790cffd&displaylang=en

 

또는 여기를 클릭해 내려받고 C:\SrvAny 폴더를 만들어 넣어둔다.

 

리소스킷을 설치했다면 커맨드창에서 다음과 같이 실행해 주고

 

instsrv "MapServer" "C:\Program Files\Windows Resource Kits\Tools\srvany.exe"

 

그냥 C:\SrvAny 폴더에 넣어두었다면 다음과 같이 실행해 준다.

 

instsrv "MapServer" "C:\SrvAny\srvany.exe"

 

레지스트리 편집기에 들어가 방금 설치한 서비스를 찾아간다.

 

regedt32

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MapServer

 

마우스 우측키를 눌러 새 '키'를 등록하고 이름을 'Parameters'라 한다.

이 키 안에 문자열 값을 추가하고 이름을 'Application' 이라고 한다.

여기에 서비스로 등록할 게임 서버 프로그램의 경로를 적어준다.

커맨드라인 파라미터가 필요하다면 'AppParameters' 문자열 값을 추가하고 적어준다.

 

Windows Registry Editor Version 5.00

 

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\MapServer\Parameters]
"Application"="c:\\MapSvr\\MAP_SVR.exe"
"AppParameters"=""
"AppDirectory"="c:\\MapSvr\\"

 

 

이제 서비스 관리도구에 들어가 MapServer 서비스를 찾아 구동시킨다.

 

 

참고: http://wiki.beyondunreal.com/wiki/Setting_Up_A_Subversion_Server

안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

출처 : http://msdn.microsoft.com/ko-kr/magazine/dd252945.aspx

 

Windows With C++
의사 변수와 형식 지정자를 사용한 X64 디버깅
Kenny Kerr
여러 해 동안 Visual C++에는 디버깅에 사용하기 위한 의사 변수와 형식 지정자가 추가되었습니다. 여기에서 의사 변수란 디버거 조사 창에 입력하여 C++ 변수와 연관되지 않은 값도 표시할 수 있는 변수를 의미합니다. 그러나 의사 변수에 대한 구체적인 정보는 공개되지 않았습니다. 필자도 이러한 정보를 대신 제공할 수 있을 만큼 충분한 내부 자료는 없지만 경험을 통해 알아낸 유용한 몇 가지 의사 변수와 형식 지정자를 소개하고자 합니다. 이 기사를 통해서 이 주제에 대한 흥미를 가질 수 있기를 기대합니다.
의사 변수(종종 의사 레지스터라고도 불림)를 소개하기에 앞서 프로세서 아키텍처와 레지스터에 대해 간단히 설명하겠습니다. 이러한 약간의 배경 정보를 이해하면 의사 변수를 더 유용하게 활용할 수 있습니다. 또한 응용 프로그램의 64비트 버전이 기존 32비트 응용 프로그램과 어떻게 다른지 이해하는 데도 도움이 됩니다. 다만 이 칼럼은 프로세서 아키텍처의 세부적인 부분을 다루는 것이 아니라 Visual C++에 대한 것이므로 x86 및 x64 프로세서 아키텍처에 대한 내용으로 제한할 것입니다. Itanium 프로세서에 추가된 차이점에 대해서는 MSDN Library에서 관련 설명서를 읽어 보십시오.


 

프로세서 아키텍처
일반인이 프로세서 아키텍처를 완전하게 이해하기란 쉽지 않습니다. C 언어와 후속 언어가 소프트웨어 업계에 큰 영향을 준 것도 이 때문입니다. 최소한 현재 가장 많이 사용되고 있는 프로세서인 x86 및 x64 프로세서 아키텍처가 무엇을 나타내는지를 이해하면 됩니다. Windows 및 Visual C++는 Itanium 프로세서를 지원하지만 이를 대상으로 개발하는 개발자는 많지 않습니다.
8비트 Intel 8080 프로세서에 기반을 두는 x86은 지난 몇십 년 동안 컴퓨터 시장을 지배해왔습니다. AMD와 Intel은 x64에서 x86에 대한 하위 버전과의 호환성을 제공하기 위해 실용적인 선택을 했습니다. 반면에 Itanium의 경우에는 기존의 x86에 제한되지 않는 강력한 새로운 아키텍처를 도입했습니다. 물론 결과적으로 지원되는 응용 프로그램의 수는 크게 줄었지만 Windows NT 개발을 이끌었던 David Cutler는 이식 가능한 운영 체제에 대한 그의 비전을 통해 시간에 지남에 따라 점차 적은 노력으로 새로운 아키텍처에 Windows를 적용할 수 있을 것이라는 약속을 했습니다.
프로세서 아키텍처의 차이점 중 많은 부분이 C++ 컴파일러에 의해 내부적으로 감춰지고 있지만 단일 호출 규칙으로 전환하는 데 따르는 장점은 개발자가 확실하게 확인할 수 있습니다. x86 컴파일러는 여러 호출 규칙을 지원하는 반면 x64 버전의 C++ 컴파일러는 단일 호출 규칙을 지원합니다. 이것은 환영할 만한 변화이며 특히 관리 코드 interop에서 C# 및 Visual Basic .NET과 같은 Microsoft .NET Framework 컴파일러가 C++ 헤더 파일의 원래 호출 규칙을 확인할 수 없는 상황에 발생하는 호출 규칙 불일치로 인한 여러 잠재적인 버그를 깔끔하게 해결할 수 있습니다. 기존에는 잘못 정의되는 경우가 많은 수동으로 만든 특성에 의존해야 했기 때문에 다양한 스택 손상 버그가 발생했습니다.
예를 들어 네이티브 C++ 호출 규칙에서는 멤버 함수를 호출하기 전에 thiscall이라고 불리는 "this" 포인터를 저장하기 위해 ecx 레지스터를 사용했습니다. 이러한 정보는 디버깅에 유용하지만 호출 규칙에 따라 차이가 있으며 어셈블러 코드와 레지스터 값을 보는 것만으로는 확실하게 알기 어려웠습니다. x64에서는 "this" 포인터가 항상 첫 번째 매개 변수로 삽입되며 이에 따라 rcx 레지스터에 저장되므로 훨씬 간단합니다.
자연스럽게 디버깅 시에 레지스터를 사용하는 방법은 프로세서에 따라 다르지만 다행스럽게도 x86과 x64 간의 관계를 활용할 수 있습니다. x86 아키텍처에서는 상위 레지스터의 하위 절반으로 구성된 하위 레지스터라는 개념이 도입되었습니다. 예를 들어 ax는 eax 레지스터의 하위 절반으로 구성된 하위 레지스터입니다. x64 아키텍처에서는 이를 확장하여 32비트 x86 레지스터의 상위 개념인 64비트 레지스터를 도입했습니다. 예를 들어 x64에서 eax는 64비트 rax 레지스터의 하위 절반으로 구성된 하위 레지스터입니다. eax와 rax는 각각 x86 및 x64에서 함수에서 반환하는 포인터나 정수로 사용되므로 흥미로울 것입니다. 자연스럽게 x86에서 64비트 값을 반환하는 함수는 한쌍의 레지스터를 사용해야 합니다.


 

의사 변수
가장 일반적인 의사 변수는 SetLastError 함수로 설정한 마지막 오류 값을 표시하는 $err일 것입니다. 표시되는 값은 GetLastError 함수에서 반환할 값을 나타냅니다.
의사 변수는 프로세서 레지스터 값을 표시하는 데도 사용할 수 있습니다. 예를 들어 $ecx는 x86 아키텍처에서 exc 레지스터의 값을 표시합니다. 프로세서 레지스터 값을 살펴보는 작업은 신세대 .NET 개발자에게는 다소 난해하게 보이겠지만 이해하기 어려운 버그를 진단하거나 프로그램의 런타임 동작을 이해하는 데 큰 도움이 됩니다. x86에서 네이티브 C++ 호출 규칙을 사용하는 경우에는 $ecx를 사용하여 "this" 포인터의 주소를 표시할 수 있습니다. 또한 두 아키텍처에서 모두 $eax를 사용하여 32비트 반환 값을 표시할 수 있습니다. 이 밖에도 사용자의 디버깅 요구에 따라 유용하게 사용할 수 있는 레지스터가 많이 있습니다.
다른 유용한 의사 변수에는 프로세스에서 커널 개체에 대한 열려 있는 핸들의 수를 표시하는 $handles와 현재 프로세스 및 스레드 토큰에 대한 매우 자세한 정보를 표시하는 $user가 있습니다. 후자는 가장 관련 코드를 디버깅하는 데 유용합니다. 그림 1에는 일반적인 의사 변수가 나와 있습니다.
의사 변수 설명
$handles 커널 개체에 대한 핸들의 수
$vframe 현재 스택 프레임 주소
$TID 현재 스레드 식별자
$registername 지정된 레지스터의 내용
$clk 시간(클록 주기)
$user 프로세스 및 스레드 토큰 정보


 

형식 지정자
형식 지정자는 조사 창에서 변수, 의사 변수 또는 식의 값이 표시되는 방법을 변경하려는 경우에 유용합니다. 대부분의 경우 조사 창은 값의 형식을 바탕으로 최적의 형식을 알아내지만 이를 변경하고 싶은 경우가 있습니다. 디버거가 변수의 형식을 유추하지 못하거나 자연적으로 형식 정보가 없는 메모리 주소를 사용하는 경우가 이에 해당합니다. 예를 들어 hr 형식 지정자는 값에 해당하는 Win32 또는 HRESULT를 표시합니다. 다른 예로는 null로 끝나는 유니코드 문자열로 값을 표시하는 su가 있습니다.
물론 형식이 지정된 텍스트의 실제 값을 얻으려는 경우가 있으며 이때는 !를 사용하면 됩니다. 마지막으로 조사 창에서 쉼표 뒤에 표시할 요소의 수를 지정하면 지정된 포인터를 n 개의 요소가 있는 배열로 처리할 수 있습니다. 그림 2에는 형식 지정자 목록이 나와 있습니다.
지정자 설명
D 십진수
U 부호 없는 십진수
O 8진수
X 16진수
F 부동 소수점
E 과학적 표기법
C 문자
S 문자열
Su 유니코드 문자열
s8 UTF-8 문자열
Hr HRESULT 또는 Win32 오류 코드
wc Windows 클래스
wm Windows 메시지
! 원시 형식


 

호출 규칙의 시각화
이러한 배경 정보를 바탕으로 몇 가지 예를 살펴보겠습니다. 다음과 같은 코드 조각이 있다고 가정해 보겠습니다. x86 컴파일러는 멤버 함수에 기본적으로 __thiscall 호출 규칙을 사용합니다. 이것은 매개 변수가 스택으로 푸시되고 "this" 포인터가 ecx 레지스터에 저장된다는 의미입니다.
struct Sample
{
    size_t m;
    Sample() : m(0x11223344) {}

    size_t Method(size_t p1, size_t p2)
    {
        return 0x44556677;
    }
};
그림 3에서는 이러한 사실과 몇 가지 추가적인 사실을 확인할 수 있습니다. 조사 창에 흥미로운 변수가 표시됩니다. $vframe은 현재 스택 프레임의 주소를 제공합니다. 이 의사 변수는 스택 프레임의 주소를 얻는 프로세서에 중립적인 방법을 제공합니다. 다음은 두 매개 변수의 주소가 나오며 각각 0x22334455 및 0x33445566입니다.
그림 3 32비트 스택 및 레지스터 (더 크게 보려면 이미지를 클릭하십시오.)
첫 번째 메모리 창도 현재 스택 프레임을 표시합니다. 스택에서 이러한 매개 변수의 값을 볼 수 있습니다. 다음은 ecx 레지스터이며 여기에서는 이를 개체의 멤버를 표시하도록 Sample에 대한 포인터로 캐스팅했습니다. 두 번째 메모리 창도 메모리의 개체를 표시합니다. 스택에서 아래쪽에 있는 멤버 변수를 볼 수 있습니다. 다음으로 $eax 변수는 함수 호출의 결과를 저장하는 레지스터의 값을 표시합니다.
같은 C++ 코드를 x64 컴파일러로 컴파일하면 상당히 다른 결과를 얻게 됩니다. 컴파일러는 x64에서 수가 크게 늘어난 레지스터를 활용하여 불필요하게 스택에 값을 푸시하는 횟수를 줄입니다. 구체적으로 살펴보면 처음 포인터나 정수 매개 변수 4개가 각각 rcx, rdx, r8 및 r9 레지스터에 저장됩니다. 멤버 함수의 경우 "this" 포인터가 첫 번째 매개 변수로 취급됩니다. 함수가 스택에 임의의 매개 변수를 임시로 저장해야 하는 경우 공간이 예약됩니다. 마지막으로 모든 포인터나 정수 결과는 rax 레지스터에 반환됩니다.
그림 4에는 이러한 예가 나와 있습니다. 이번에도 $vframe은 현재 스택 프레임의 주소를 표시하지만 이제는 모든 값이 64비트인 것을 볼 수 있습니다. 다음 두 매개 변수의 주소가 나오며 매개 변수는 호출된 함수에 레지스터로 전달되었지만 현재 스택 프레임에 이러한 매개 변수가 있는 것을 알 수 있습니다. 이것은 디버그를 위한 동작으로서 함수가 스택에 매개 변수를 저장한 결과입니다. 다음 세 개의 변수 $rcx, $r8 및 $rdx는 앞서 설명한 "this" 포인터를 포함하여 세 매개 변수의 값을 제공합니다. 마지막으로 $rax는 함수 호출의 결과를 저장하는 레지스터의 값을 표시합니다.
그림 4 64비트 스택 및 레지스터 (더 크게 보려면 이미지를 클릭하십시오.)


 

오류 코드
의사 변수와 형식 지정자는 다양한 형식과 위치의 오류 코드를 살펴보는 데 매우 유용합니다. 그림 5에는 마지막 오류 코드의 값과 설명을 제공하는 $err,hr과 같은 몇 가지 예가 나와 있습니다. 이러한 예는 볼륨 섀도 복사본 서비스의 ERROR_VOLMGR_DISK_NOT_EMPTY 오류 코드와 동일합니다. $err 의사 변수는 값을 제공하고 hr 형식 지정자는 조사 창에 이를 오류 코드로 형식을 지정하도록 지시합니다. hresult는 C++ 변수이며 조사 창은 자동으로 이를 나타내는 잘 알려진 상수를 표시합니다. E_INVALIDARG,x는 자동 형식 지정을 덮어쓰는 방법을 보여 줍니다. 이 경우에는 x 형식 지정자가 값을 16진수 값으로 표시하도록 조사 창에 지시합니다. 마지막 예는 거의 모든 주소를 배열로 변환하는 방법을 보여 줍니다.
그림 5 오류 코드(더 크게 보려면 이미지를 클릭하십시오.)


 

보안 컨텍스트 디버깅
그림 6에는 인상적인 $user 의사 변수가 나와 있습니다. 여기에서 Bob이 Alice를 가장하고 있음을 알 수 있습니다! 이 의사 변수는 프로세스와 스레드 토큰에 대한 많은 상세 정보를 제공하며 클라이언트/서버 응용 프로그램에서 가장 문제를 디버깅할 때 유용합니다.
그림 6 $user 의사 변수 (더 크게 보려면 이미지를 클릭하십시오.)
이 밖에도 Visual Studio 조사 창에서 사용할 수 있는 트릭과 C# 코드를 디버깅하는 데 도움이 되는 트릭이 있습니다. 또한 Debugging Tools for Windows에는 확장된 의사 변수 집합이 포함되어 있습니다. 추가적인 디버깅 관련 팁은 Advanced Windows Debugging을 참조하십시오.


 

질문이나 의견이 있으시면 mmwincpp@microsoft.com으로 보내시기 바랍니다.


 

Kenny Kerr는 Windows용 소프트웨어를 전문적으로 개발하는 소프트웨어 개발자로, 프로그래밍과 소프트웨어 설계 분야에서 왕성한 집필 및 교육 활동을 하고 있습니다. 문의 사항이 있으면 weblogs.asp.net/kennykerr를 방문하시기 바랍니다.
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,

출처 : http://blog.naver.com/ntpeng?Redirect=Log&logNo=30064748922

 

"응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다.

  이 문제를 해결하려면 응용 프로그램을 다시 설치하십시오."

 

프로젝트 진행 도중 위와 같은 멘트를 만났습니다.

분명 소스도 같고 변경사항이라곤 기능상 변경 뿐인데 갑작스러운 등장에 상당히 당황할 수 밖에 없었습니다.

 

시도 1 : 문제가 발생한 분의 컴퓨터에서 해당 실행파일과 DLL을 복사한 후 구동

결과 1 : 실패

 

시도 2 : 본인의 컴퓨터 안의 아래 폴더에 있는 Manifest와 dll 을 넣어보았다.

            C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

결과 2 : 실패...

 

시도 3 : 문제가 발생한 다른분의 컴퓨터에 본인의 컴퓨터 안에 있는 Manifest 와 dll, 해당 파일을 넣고 구동

결과 3 : 참패...

 

시도 4 : 문제가 발생한 다른분의 컴퓨터에 본인의 프로그램을 컴파일 후 전송, 구동

결과 4 : 구동성공..

 

시도 5 : 문제가 발생한 분의 실행파일과 DLL 에다 해당 컴퓨터의 아래 폴더에 있는 Manifest 와 DLL 을 복사

            C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

결과 5 : 구동 성공

 

왜 그럴까 한참 생각하게 되었습니다.

확인작업을 하던 중 충격적인 사실을 확인하게 되었구요.

 

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

이 폴더에 있는 파일의 버전을 확인해보니 두 사람이 일치하지 않았던 것입니다.

문제가 발생한 분의 Manifest와 DLL 버전이 높았던게 이유 입니다.

상당히 당황했지만 일찍 발견한게 다행이라는 느낌이 드는 순간 이였습니다.

 

 

추가내용

"응용 프로그램 구성이 올바르지 않기 때문에 이 응용 프로그램을 시작하지 못했습니다..."

문제가 발생했을 때 대처방법

 

방법 1

해당 응용프로그램이 실행되는 컴퓨터가 Visual Studio 를 사용하지 않는 컴퓨터라면

실행하려는 응용프로그램을 컴파일한 컴퓨터의 아래 폴더에서 Manifest 파일과 DLL 파일을 복사해서

문제가 생긴 프로그램의 폴더에 넣어줍니다.

C:\Program Files\Microsoft Visual Studio 8\VC\redist\x86\Microsoft.VC80.CRT

 

방법 2

재배포 가능 패키지를 설치하는 방법이 있다. (주의:버전에 맞게 설치하세요)

용량이 2메가를 넘어가기 때문에 첨부할 수 없었습니다. 마소 공식 다운로드를 이용 해 주세요

 

Visual C++ 2005 재배포 가능 패키지 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyID=32bc1bee-a3f9-4c13-9c99-220b62a191ee&DisplayLang=ko

 

Visual C++ 2005 재배포 가능 패키지 (x64)

http://www.microsoft.com/downloads/details.aspx?FamilyID=90548130-4468-4bbc-9673-d6acabd5d13b&DisplayLang=ko

 

Visual C++ 2005 SP1 재배포 가능 패키지 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyID=200b2fd9-ae1a-4a14-984d-389c36f85647&DisplayLang=ko

 

Visual C++ 2005 SP1 재배포 가능 패키지 (x64)

http://www.microsoft.com/downloads/details.aspx?FamilyID=eb4ebe2d-33c0-4a47-9dd4-b9a6d7bd44da&DisplayLang=ko

 

Visual C++ 2008 재배포 가능 패키지 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyID=9b2da534-3e03-4391-8a4d-074b9f2bc1bf&DisplayLang=ko

 

Visual C++ 2008 재배포 가능 패키지 (x64)

http://www.microsoft.com/downloads/details.aspx?FamilyID=bd2a6171-e2d6-4230-b809-9a8d7548c1b6&DisplayLang=ko

 

Visual C++ 2008 SP1 재배포 가능 패키지 (x86)

http://www.microsoft.com/downloads/details.aspx?FamilyID=a5c84275-3b97-4ab7-a40d-3802b2af5fc2&DisplayLang=ko

 

Visual C++ 2008 SP1 재배포 가능 패키지 (x64)

http://www.microsoft.com/downloads/details.aspx?FamilyID=ba9257ca-337f-4b40-8c14-157cfdffee4e&DisplayLang=ko

 

방법3

해당 응용프로그램을 제작하는 컴퓨터에서 인스톨 패키지를 작성하는 방법이 있습니다.

만드는 방법은 비교적 쉬우니 조금만 다뤄보면 알 수 있습니다.

 

2009-08-03 추가

새 프로젝트 만드는 곳에서 프로젝트 형식은 "기타 프로젝트 형식 > 설치 및 배포" 이고

템플릿은 설치 프로젝트나 기타 원하는 항복으로 선택하면 됩니다.

간단하게 만드는것은 설치 프로젝트가 되겠습니다.

 
안정적인 DNS서비스 DNSEver DNS server, DNS service
Posted by 키르히아이스
,