결론 : ㅆㅂ 졸라 빡시다 ㄱ-






서론
UFO:AI의 한글화를 하고 있는데, 번역에 있어서 가장 어려운 것은
그것을 포함하는 단어가 한글에 없을때(외래어로 사용중일 경우)
그리고 길이제한이 있는데 너무 길 경우
단어가 짧은데 내포하는 의미가 많을 때
정확한 의미로 풀어 쓰자니 폼이 안날 때

그리고 마지막으로 한글 맞춤법 기억 안날 때


아무튼. 번역을 하면서 단어 사전을 만들어 가면서 여럿이서 작업하지 않으면
뒤죽박죽이 된다는 것과, 어느정도는 문체도 통일을 해야 한다는 것,
그리고 반드시 퇴고는 타인이 해줄것 정도를 뼈저리게 느끼고 있다.

'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

UFO:AI 2.3 개발자 버전  (0) 2009.11.27
언어명에 대한 고찰?  (1) 2009.03.17
보안등급 - Clearance  (0) 2009.03.09
UFO:AI 한글화 작업은 빡시군요..  (6) 2009.03.07
UFO:AI 한글화 프로젝트 발동!  (4) 2009.03.03
Posted by 구차니
당췌.. 죽어라 찾아도 안나오고, 맞는지는 모르는 내용일뿐이고 -ㅁ-
어찌하란 말이오~ ㅠ.ㅠ

Q: How do the SG rankings work?
A: The SG rankings represent Citadel security levels. Alpha Clearance has full permissions and are the heroes who take responsibility for keeping the Citadel going. Beta Clearance are team leaders. Delta Clearance are team lieutenants. Epsilon Clearance is everyone else, and Sigma Clearance is for temporary guests (and for people who haven't gotten oriented yet).

[출처 : http://www.guildportal.com/Guild.aspx?GuildID=231718&ForumID=1170773&TabID=1951423&TopicID=7059500]


굳이 비교하자면
Alpha Clearance는 1급비밀
Beta Clearance는 2급비밀
Delta Clearance는 3급 비밀
Epsilion/Sigma Clearance는 대외비 정도 되려나?


CONFIDENTIAL: Applied to information or material the unauthorized disclosure of which could be reasonably expected to cause damage to the national security.

SECRET: Applied to information or material the unauthorized disclosure of which reasonably could be expected to cause serious damage to the national security.

TOP SECRET: Applied to information or material the unauthorized disclosure of which reasonably could be expected to cause exceptionally grave damage to the national security.


[링크 : http://usmilitary.about.com/cs/generalinfo/a/security.htm]


'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

언어명에 대한 고찰?  (1) 2009.03.17
번역의 어려움  (5) 2009.03.12
UFO:AI 한글화 작업은 빡시군요..  (6) 2009.03.07
UFO:AI 한글화 프로젝트 발동!  (4) 2009.03.03
UFO : AI - 스펙은?  (4) 2009.02.17
Posted by 구차니
어떻게 보면 참 별거 아닌일에 기운이 빠지는군요..
sourgeforge ufo:ai 팀에 정식으로 한글 번역본을 추가 요청을 하였고,
ufo:ai 팀에서는 GPL 라이센스의 TTF 폰트와 함께 주지 않으면 넣을 수 없다고 했습니다.

그래서 현재 리눅스 상에 포함되어 있는 폰트인 백묵폰트를 발견하고,
이 것이 공개인지, GPL에 따르는 것인지를 본 저작권자에게 물어 보았습니다.

어쩌면 게임이라는 부정적 이미지(게임은 당연히 금전적 이익을 추구한다)
로 인해서 무료 open source 게임임에도 불구하고 거절 의사를 듣게 되었습니다.


막상 거절 의사를 들으니 막막하다는 생각이 듭니다.
아 순탄하게 고고싱인데 눈앞에 넘지 못할 벽이 있는 느낌이랄까...
처음에는 저작권자에게 야속하고, 나 역시 어떠한 영리를 바라고 하는게 아닌데 왜 이걸 못 알아 줄까 하는
아쉬움도 있었지만, 한글 폰트 라는 것이 쉽게만들어 지는게 아닌 것을 알기에,
그리고 디자인실 하나를 책임지는 책임자로서 그분의 입장도 이해가 되었습니다.
더불어, 게임이라는 부정적 이미지에 대해서 기성세대가 지닌 느낌도 더욱 자세히 알게 되었습니다.

무료이고 공개라고 해도, 나중에 유료화 될 수 있고
무료, 공개의 목적이 진짜 무료 공개가 아닌 사이트 가입등의 금전적인 의도일 수도 있기 때문이라는 것인데

어쩌면 제가 ufo:ai 라는 프로젝트를 너무 믿고 있는 것일 수도 있고,
어쩌면 제가 너무 돈에 대해서 미련이 없는 것일 수도 있다는 생각이 듭니다.

일단은 GPL 라이센스로 확인된 은글꼴에 다시 연락을 취해 봐야겠습니다.


[은글꼴 : http://kldp.net/projects/unfonts]
[백묵글꼴 : http://kldp.net/projects/baekmuk/]

'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

번역의 어려움  (5) 2009.03.12
보안등급 - Clearance  (0) 2009.03.09
UFO:AI 한글화 프로젝트 발동!  (4) 2009.03.03
UFO : AI - 스펙은?  (4) 2009.02.17
UFO : Alien Invasion - XCOM이여 영원하라!!  (4) 2009.02.16
Posted by 구차니
typedef unsigned char		u8;
typedef unsigned short		u16;

#define ARABIC_SIN 0
#define ARABIC_END 1
#define ARABIC_1ST 2
#define ARABIC_MID 3

u16 ArabicEncode(u16 *arab, u8 pos, BOOL* stepit, BOOL* is2set)
{
    u16 ucode = 0;
    BOOL nowChar = FALSE;
    switch(*arab)
    {
        // 2개일 경우
        case 0x0622: ucode = 0xFE81; nowChar = TRUE; break;
        case 0x0623: ucode = 0xFE83; nowChar = TRUE; break;
        case 0x0624: ucode = 0xFE85; nowChar = TRUE; break;
        case 0x0625: ucode = 0xFE87; nowChar = TRUE; break;
        case 0x0627: ucode = 0xFE8D; nowChar = TRUE; break;
        case 0x0629: ucode = 0xFE93; nowChar = TRUE; break;
        case 0x062F: ucode = 0xFEA9; nowChar = TRUE; break;
        case 0x0630: ucode = 0xFEAB; nowChar = TRUE; break;
        case 0x0631: ucode = 0xFEAD; nowChar = TRUE; break;
        case 0x0632: ucode = 0xFEAF; nowChar = TRUE; break;
        case 0x0648: ucode = 0xFEED; nowChar = TRUE; break;
        case 0x0649: ucode = 0xFEEF; nowChar = TRUE; break;

        // 4개 일경우
        case 0x0626: ucode = 0xFE89; nowChar = FALSE; break;
        case 0x0628: ucode = 0xFE8F; nowChar = FALSE; break;
        case 0x062A: ucode = 0xFE95; nowChar = FALSE; break;
        case 0x062B: ucode = 0xFE99; nowChar = FALSE; break;
        case 0x062C: ucode = 0xFE9D; nowChar = FALSE; break;
        case 0x062D: ucode = 0xFEA1; nowChar = FALSE; break;
        case 0x062E: ucode = 0xFEA5; nowChar = FALSE; break;
        case 0x0633: ucode = 0xFEB1; nowChar = FALSE; break;
        case 0x0634: ucode = 0xFEB5; nowChar = FALSE; break;
        case 0x0635: ucode = 0xFEB9; nowChar = FALSE; break;
        case 0x0636: ucode = 0xFEBD; nowChar = FALSE; break;
        case 0x0637: ucode = 0xFEC1; nowChar = FALSE; break;
        case 0x0638: ucode = 0xFEC5; nowChar = FALSE; break;
        case 0x0639: ucode = 0xFEC9; nowChar = FALSE; break;
        case 0x063A: ucode = 0xFECD; nowChar = FALSE; break;
        case 0x0641: ucode = 0xFED1; nowChar = FALSE; break;
        case 0x0642: ucode = 0xFED5; nowChar = FALSE; break;
        case 0x0643: ucode = 0xFED9; nowChar = FALSE; break;
        case 0x0644: ucode = 0xFEDD; nowChar = FALSE; break;
        case 0x0645: ucode = 0xFEE1; nowChar = FALSE; break;
        case 0x0646: ucode = 0xFEE5; nowChar = FALSE; break;
        case 0x0647: ucode = 0xFEE9; nowChar = FALSE; break;
        case 0x064A: ucode = 0xFEF1; nowChar = FALSE; break;
    }

    if((*arab == 0x0644) && (pos != ARABIC_END) && (pos != ARABIC_SIN))
    {
        switch(*(arab+1))
        {
            case 0x0622: ucode = 0xFEF5; *stepit = TRUE; break;
            case 0x0623: ucode = 0xFEF7; *stepit = TRUE; break;
            case 0x0625: ucode = 0xFEF9; *stepit = TRUE; break;
            case 0x0627: ucode = 0xFEFB; *stepit = TRUE; break;
            default: break;
        }

        if(*stepit == TRUE)
        {
            switch(pos)
            {
                case ARABIC_1ST:
                    if(*(arab+2) == 0x0020) break;
                    else { ucode += 0x001; break; }
                case ARABIC_MID:
                    if(*is2set == TRUE) break;
                    else { ucode += 0x001; break; }
            }

            *is2set = nowChar;
            return ucode;
        }
    }

    switch(pos)
    {
        //case ARABIC_SIN: return ucode;
        case ARABIC_1ST:
                if(nowChar == TRUE) ucode = *arab;
                else ucode += ARABIC_1ST;
                break;
        case ARABIC_MID:
                if(nowChar == TRUE) // 2개 짜리
                {
                    if(*is2set == TRUE) ucode = *arab;
                    else ucode += ARABIC_END;
                }
                else // 4개 짜리
                {
                    if(*is2set == TRUE) ucode += ARABIC_1ST;
                    else ucode += ARABIC_MID;
                }
                break;
        case ARABIC_END:
                if(nowChar == TRUE) // 2개 짜리
                {
                    if(*is2set == TRUE) ucode = *arab;
                    else ucode += ARABIC_END;
                }
                else // 4개 짜리
                {
                    if(*is2set == TRUE) ucode = *arab;
                    else ucode += ARABIC_END;
                }
                break;
    }

    *is2set = nowChar;
    return ucode;
}

BOOL isarabicstr(u16 *pu16String, u16 u16StrLength)
{
    u16 index = 0;
    BOOL arabic_exist = FALSE;

    for(index = 0;index < u16StrLength;index++)
    {
        if(pu16String[index] >= 0x060C && pu16String[index] <= 0x064B) return TRUE;
    }

    return arabic_exist;
}

void Arabic_automata(u16 *target_str, u16 *src_str,u16 u16Length)
{
	BOOL b8ArabSpe = FALSE;
	BOOL b8is2set = FALSE;
	u16 u16Index = 0;
	u16 u16Index2 = 0;
	u16 u16Index3 = 0;
	u16 u16offset = 0;
	u16 *temp_str = NULL;
	
	temp_str = malloc((u16Length + 1) * 2);

	for (u16Index = 0; u16Index < u16Length;)
	{
		if (src_str[u16Index] >= 0x060C && u16Index < u16Length) // arabic
		{
			u16Index2 = u16Index; // 아랍어 시작점
			while(src_str[u16Index] >= 0x060C && u16Index < u16Length ) u16Index++;
			if(u16Index - u16Index2 == 1) // 단독형
			{
				temp_str[u16Length - u16Index2 + u16offset - 1] = src_str[u16Index2];
			}
			else // 2개 이상 단어
			{
				// 첫자
				temp_str[u16Length - u16Index2 + u16offset - 1] = ArabicEncode(src_str + u16Index2, ARABIC_1ST ,&b8ArabSpe, &b8is2set);
				if(b8ArabSpe == TRUE) {++u16offset; ++u16Index2;}
				
				//중간글자
				for(u16Index3 = u16Index2 + 1; u16Index3 < u16Index - 1; u16Index3++)
				{
					if(b8ArabSpe == TRUE)
					{
						b8ArabSpe = FALSE;
						temp_str[u16Length - u16Index3 + u16offset - 1] = ArabicEncode(src_str + u16Index3, ARABIC_1ST ,&b8ArabSpe, &b8is2set);
					}
					else
						temp_str[u16Length - u16Index3 + u16offset - 1] = ArabicEncode(src_str + u16Index3, ARABIC_MID ,&b8ArabSpe, &b8is2set);
					if(b8ArabSpe == TRUE) {++u16offset; ++u16Index3;}
				}
				//마지막자
				if(u16Index - u16Index2 != 1)
				{
					if(b8ArabSpe == TRUE)
					{
						b8ArabSpe = FALSE;
						temp_str[u16Length - u16Index + u16offset] = ArabicEncode(src_str + u16Index - 1, ARABIC_1ST ,&b8ArabSpe, &b8is2set);
					}
					else
						temp_str[u16Length - u16Index + u16offset] = ArabicEncode(src_str + u16Index - 1, ARABIC_END ,&b8ArabSpe, &b8is2set);
					if(b8ArabSpe == TRUE) b8ArabSpe = FALSE;
				}
			}
		}
		else if (src_str[u16Index] == 0x0020)
		{
			u16Index2 = u16Index++;
			temp_str[u16Length - u16Index + u16offset] = src_str[u16Index - 1];
		}
		else // not arabic
		{
			u16Index2 = u16Index; // 영어 시작점
			while(src_str[u16Index] > 32 && src_str[u16Index] < 255  && u16Index < u16Length && src_str[u16Index] != 0x0020) u16Index++;
			for(u16Index3 = 0; u16Index3 < u16Index - u16Index2; u16Index3++)
			{
				temp_str[u16Length - u16Index + u16Index3 + u16offset] = src_str[u16Index2 + u16Index3];
			}
		}
	}

	if(u16offset > 0)
	{
		memcpy(target_str,temp_str + u16offset,(u16Length - u16offset) * 2);
		memset(target_str + (u16Length - u16offset),0x00,u16offset * 2);
	}
	else
	{
		memcpy(target_str,temp_str,(u16Length) * 2);
		memset(target_str + u16Length,0x00,2);
	}

	free(temp_str);
}



아놔 syntax highlighter 왜 이따구야 ㅠ.ㅠ

'모종의 음모 > 아랍어 오토마타' 카테고리의 다른 글

아랍어 조합 방법 - unicode  (5) 2008.11.16
Posted by 구차니

UFO:AI의 한글화를 위한 모종의 음모가 발동되었습니다.
어떻게 보면 공식 번역작업은 처음하는거라 부담감이 느껴지지만,
다음 UFO:AI 정식 릴리즈에 한글이 추가 될 수 있도록 노력해 봐야겠습니다.

그나저나.. 내가 번역하고 있는 부분은 어찌 된게... 전부 의학용어에 안드로메다 용어에 비문장 뿐인지 ㅠ.ㅠ
google.com은 서로 연관은 같지만 링크는 존재하지 않는 듯한 느낌이 들어, 처음 사용하는 사람으로는
상당한 불편함이 느껴진다. 여전히 한번에 내 프로젝트에 가지 못하고 여기저기 헤매다가 겨우겨우 들어 가는 신세

그리고 구글코드는 총 1024MB(=1GB)의 프로젝트 용량을 지원하고, https+svn 을 지원한다.
개인적인 느낌이지만, 다운로드 / 업로드는 빠르지만, 응답속도는 느린 느낌이다.

'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

번역의 어려움  (5) 2009.03.12
보안등급 - Clearance  (0) 2009.03.09
UFO:AI 한글화 작업은 빡시군요..  (6) 2009.03.07
UFO : AI - 스펙은?  (4) 2009.02.17
UFO : Alien Invasion - XCOM이여 영원하라!!  (4) 2009.02.16
Posted by 구차니
솔찍히 적힌데도 없고, 그러다 보니 정확한 스펙을 모르겠다.

아무튼 Quake2 엔진으로 오리지널 UFO에 비하면 전투 지역이 좁지만,

내 TC1100 에서는 전투는 버벅버벅 대는 것으로 봐서.. 생각보다는 스펙이 높을 듯 하다.


일단 TC1100 의 스펙은

센트리노 1.2Ghz
1GB memory
NVIDIA Geforce4 420 Go!

인데.. 프레임은 지구본 모드는 55fps 정도, 전투에서도 그정도 나오긴하지만,
이상하게 마우스가 순간이동도 하고 얼어 버리기도 하고 그래서
게임은 무리라고 판단이 된다. 설정을 조금 바꾸고 다시 해보고 나서 리포팅을 -ㅁ-


결론 : sourceforge project 에 한글화 추가할려고 오늘 가입까지 했다(응?)
Posted by 구차니
고등학교 때였던가.. 중학교에서 고등학교 올라갈때 쯔음 죽어라 했던 X-COM2 라는 게임
그리고 그 게임에 삘 받아서 사버린 UFO 라는 게임

원래 순서는 X-COM2 가 2편이고 UFO가 1편인데.. 거꾸로 했다. OTL

각설하고 간단하게 말하면, 나쁜 외계인을 때려잡아 고문도 좀 하고 그래서
외계인 기지를 뽀개고 지구에 평화를 되찾는다는 훈훈한 이야기인데
dosBOX에서 돌리다 보니 답답하기도 하고 눈이 높아진 그래픽으로 인해서
2D 게임은 이제 눈에도 안들어 오게 되다 보니, 고전 게임방에서도 겨우겨우 명맥을 유지 하는 녀석이다.

물론 지금에는 너무 생소한 '턴'제 게임이지만,
한턴 한턴의 긴박감은 요즘의 실시간 전략 게임이 따라올 수 없는 매력으로
몇년의 시간이 지나더라도 다시 손을 끌게 한다.


간만에 들른 X-COM 카페에서 누군가가 한글화 하자는 이야기가 나오길래 한번 추적을 해보았더니

Open Source이며
multi platform 지원하며(Linux / Windows / MacOS 지원)
Quake 2 엔진으로 작동하는
Multiplay 지원하는
Free 게임이다.



[공식 홈페이지  http://ufoai.sourceforge.net/]
[다운로드 : http://sourceforge.net/project/showfiles.php?group_id=157793&package_id=194208]

프로그램 용량은 대략 380MB 상당히 큰편이다.
근데... 최소사양은 어디 짱박힌거니? ㄱ-

'모종의 음모 > UFO:AI 한글화' 카테고리의 다른 글

번역의 어려움  (5) 2009.03.12
보안등급 - Clearance  (0) 2009.03.09
UFO:AI 한글화 작업은 빡시군요..  (6) 2009.03.07
UFO:AI 한글화 프로젝트 발동!  (4) 2009.03.03
UFO : AI - 스펙은?  (4) 2009.02.17
Posted by 구차니
모종의 음모/Notepad22009. 1. 4. 22:30
메뉴상에서 notepad.exe를 notepad2.exe로 대체 할 것인지에 대한 메뉴를 추가 하였다.
일단 사용한 함수는 RegSetValueEx 이다.

 
 LONG WINAPI RegSetValueEx(
   __in        HKEY hKey,
   __in_opt    LPCTSTR lpValueName,
   __reserved  DWORD Reserved,
   __in        DWORD dwType,
   __in_opt    const BYTE *lpData,
   __in        DWORD cbData
 );

기존에는 RegSetValue를 사용했었는데, 이 녀석은 Key , SubKey에 대해서 만 등록을 할 수 있지,
Value는 등록하지 못하므로 Value를 등록 할 수 있는 RegSetValueEx를 사용하게 되었다.

 RegSetValueExW(key1, L"Debugger", 0, REG_SZ, cmd, len * 2);
데이터는 위의 prototype를 보면 알겠지만,
"키,value name, 0, 변수 타입, value, 길이" 의 순서인데 reserved 값으로 0이 고정 되어 있다.

notepad2 프로젝트는 unicode로 되어 있으므로, 이에 대응하기 위해서 RegSetValueExW로 함수를 사용하였는데,
버그인지는 모르겠지만, len 부분에서 2배를 해주어야 만 제대로 value가 들어 가는 문제가 있었다.
2배라고 함은 unicode는 2byte 문자열이므로 이를 맞추어 주기 위해 2배가 된 것 같기는 하지만,
문자열이 unicode인데 길이만 따로 ascii 식으로 세어 준다는 것은 무언가의 문제가 있는 것으로 보인다.

그리고 prototype 상으로는 BYTE 타입의 문자열을 원하므로 Unicode 함수임에도 불구하고 warning을 출력한다.
--------------------Configuration: Notepad2 - Win32 Release--------------------
Compiling...
Notepad2.c
C:\cvsdown\np2src_VC6\src\Notepad2.c(2994) : warning C4133: 'function' : incompatible types - from 'unsigned short [264]' to 'const unsigned char *'
Linking...

Notepad2.exe - 0 error(s), 1 warning(s)


[출처 : http://msdn.microsoft.com/en-us/library/ms724923(VS.85).aspx]
Posted by 구차니
모종의 음모/Notepad22009. 1. 4. 00:18
Visual Studio Debugger How to: Launch the Debugger Automatically

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\currentversion\image file execution options

위의 키는 현재 notepad2.inf에서
(아마도) C:\WINDOWS\NOTEPAD.EXE(혹은 C:\WINDOWS\SYSTEM32\NOTEPAD.EXE)를
대체해서 실행하도록 하는 용도로 쓰이고 있다. (도대체 어느 녀석이 어느 녀석이지?)
하지만 원래 용도는, 프로그램 실행중에 죽는 경우에 디버깅을 하기 위한 방법으로 사용하는 것 이라고 한다.

[참고 : http://byung.egloos.com/3572751]
[참고 : http://www.osix.net/modules/article/?id=781]
[출처 : http://msdn.microsoft.com/en-us/library/a329t4ed.aspx]


WindowsXP SP2 에서 notepad.exe를 notepad2.exe로 교체 하는 방법에 대한 내용이다.
여기서 건진 키워드는 WFP (files protected by Windows File Protection)
[출처 : http://weblogs.asp.net/rweigelt/archive/2004/08/12/213085.aspx]

WFP는 Windows2000 부터 지원하고 있으며 C:\WINDOWS\SYSTEM32\dllcache 폴더 그리고 레지스트리와
연관이 되어 있다

WFP 기능의 작동 방법

WFP 기능은 두 가지 메커니즘을 사용하여 시스템 파일을 보호합니다. 첫 번째 메커니즘은 백그라운드에서 실행됩니다. 이 보호 기능은 WFP에 보호된 디렉터리의 파일에 대한 디렉터리 변경 알림이 나타난 후 실행됩니다. WFP에 이 알림이 나타나면 WFP는 어떤 파일이 변경되었는지 확인합니다. 파일이 보호되면 WFP는 카탈로그 파일에서 파일 서명을 찾아 새 파일이 올바른 버전인지 확인합니다. 이 파일이 올바른 버전이 아니면 WFP는 새 파일을 캐시 폴더(파일이 캐시 폴더에 있는 경우) 또는 설치 원본에 있는 파일로 교체합니다. WFP는 다음과 같은 순서로 해당 위치에서 올바른 파일을 검색합니다.
  1. 캐시 폴더(기본적으로 %systemroot%\system32\dllcache)
  2. 네트워크 설치 경로(네트워크 설치를 사용하여 시스템을 설치한 경우)
  3. Windows CD-ROM(CD-ROM을 사용하여 시스템을 설치한 경우)
WFP가 캐시 폴더에서 파일을 찾거나 설치 원본이 자동으로 발견되면 WFP는 이 파일을 자동으로 교체합니다.
[공식 : http://support.microsoft.com/kb/222193]

파일이 두개인 이유는 아마도 하위 호환성으로 인해서 기존의 하위 버전에서는 존재하지 않던
C:\WINDOWS\SYSTEM32 폴더의 호환성을 위해 C:\WINDOWS에도 notepad.exe를 놔두었다고 한다.
[출처 : http://labnol.blogspot.com/2006/03/why-two-notebookexe-files-in-windows.html]
Posted by 구차니
모종의 음모/Notepad22008. 12. 29. 23:54
메모장2 한글화를 위해서 context-menu 역시 한글로 하자는 의견이 나와서 수정을 하게 되었다.
물론.. 이번에는 검색도 없이 조언을 받아 약간의 시행오차를 거쳐 수정하게 되었다.

frhed를 이용한 테스트

step 1. 레지스트리는 HKEY_CLASSES_ROOT\*\shell 에 추가되는데 "Open in frhed" 라는 key가 보인다.


step 2. 하위 항목인 "command" 키에는 실행될 프로그램의 경로 및 인자를 넘겨 주기 위한 %1이 존재한다.


step 3. "Open in frhed" 키에 존재하는 (기본값) 의 내용을 수정해 준다.


step 4. context-menu에서 출력되는 모습을 구경한다. 기본값을 설정해준 대로 변경되었다.
   


이것을 이용하면, 출력 포맷은 바뀌어도 key는 변하지 않으므로 수정이 용이하다고 한다. (BLUE'nLIVE 님의 조언)


레지스트리 편집기를 이용하는 것 말고 프로그램으로 이것을 적용하려면 아래와 같이 하면된다.
            HKEY key1;
            LONG res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2",&key1);
            if (res == ERROR_SUCCESS)
            {
                WCHAR cmd[] = L"메모장2로 열기(&E)";
                RegSetValue(key1, NULL, REG_SZ, cmd, wcslen(cmd)); // wcslen - strlen for unicode
            }

            res = RegCreateKey(HKEY_CLASSES_ROOT,L"*\\shell\\Open with notepad2\\command",&key1);
            if (res == ERROR_SUCCESS)
            {
                WCHAR cmd[MAX_PATH + 4];
                WCHAR path[MAX_PATH];
                int len;
                GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
                len = wsprintf(cmd, L"%s %%1", path);
                RegSetValue(key1, NULL, REG_SZ, cmd, len);
            }

[wcslen  : http://msdn.microsoft.com/en-us/library/78zh94ax(VS.71).aspx]
Posted by 구차니