모종의 음모/Notepad22008. 12. 28. 00:37
컴파일을 이상없이 되는 관계로!
이제 기능추가를 위해 몸부림을 쳤다 ^^;

추가 될 내용은 레지스트리 관련기능들 인데..
문제는 /D "_UNICODE" 로 인해서 함수들이 모두 유니코드 대응으로 변환되었다는 점이다.



이로 인해서 약간의 삽질이 추가 되었다.

            HKEY key1;
            LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
                L"Unknown\\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);

유니코드로 함수들이 변경되면서 char 형의 변수에서 WCHAR 형으로 바뀌고
각종 스트링들도 T 접두를 붙여서 unicode 형으로 바꾸어 주었다.
물론 sprintf 역시 유니코드를 지원하는 wsprintf로 변경!

이로서 간편하게 context-menu에서 실행이 가능하도록 설정을 할 수 있게 되었다.
Posted by 구차니
모종의 음모/Notepad22008. 12. 26. 00:48
Change Log
컨텍스트 메뉴(우클릭 메뉴) 연결을 위한 메시지 변경
Add to unknown file type -> Add context-menu to unknown file type
Add to all file type -> Add context-menu to all file type

일단은 ini 파일에 만 추가 하도록 작성을 할 예정인데, 이럴 경우에는 ini 파일 내용과
레지스트리의 설정이 일치 하지 않을 것이 우려 되어서 어디에 추가 하는 것이 깔끔할지 고려중

void LoadSettings();
void SaveSettings(BOOL);

이 두녀석으로 설정을 ini 파일로 부터 읽어 오고 저장을 하도록 하는데
최초 실행시에는 ini 파일을 생성하고

int  CreateIniFile();

종료할때 SaveSetting을 하도록 함으로서, 레지스트리에 모두 저장하는 frhed 와는
구조적으로 약간의 차이점이 있다. 아무래도 레지스트리 부분은 ini에 저장을 하되
별도로 레지스트리를 체크 하도록 별도 루팅을 적용해야 할 듯 하다.

단계
1. ini 파일에 설정을 읽는다.
2. 설정에 따른 레지스트리 설정을 확인한다.
3. ini 파일의 설정에 맞추도록 레지스트리를 설정한다.

아무래도 이렇게 해야지 안정적으로 ini 설정과 동기화가 가능할 듯 하다.
그리고 초기 설정값은 파일확장자와 연결하지 않는 것으로 하는게 편할 듯.


잡소리 : 생각해보면 별거 아닌데..
            그냥 copy & paste 하고 ini 파일에 하지 않으면 간단할 걸 너무 고민하는 것 같기도 하다.
Posted by 구차니
모종의 음모/Notepad22008. 12. 24. 00:31
MS Platform SDK를 설치 한다고 해서 바로 되는게 아니라
우선순위가 상당히 낮아져 있기 때문에 Visual Studio에서 설정을 바꾸어 주어야 한다는 말에
설정을 바꾸고 선언문을 삭제 하니 이상없이 컴파일이 되었다.




물론 소스상의 문제(?)로 프로토타입과 실제 함수의 리턴 타입이 맞지 않아 에러가 발생을 하긴 했지만 말이다.
일단 DWORD *func와 DWORD_PTR func가 같아 보이는데, 다르게 인식을 해서 생긴 문제였다.


아무튼 요즘에 Win32API 스타일로 프로그래밍을 하다 보니, 조금은 눈에 익은 녀석들이 보여서
상대적으로 그다지 어렵지는 않게 수정을 하고는 있지만, 생각보다 상당히 방대한 녀석이라..
Source Insight 없이 Visual Studio만으로 하기에는 상당히 귀찮은 느낌이 든다. ㅠ.ㅠ

오늘은 메뉴에 추가해서 체크 on/off까지만~


Posted by 구차니
모종의 음모/Notepad22008. 12. 22. 00:57

프로젝트 설정에서 기본 값으로는 PlatformSDK의 include를 사용하지 않기 때문에
Platform SDK를 설치 한다고 해서 에러가 사라지는 것은 아닌 듯 하다.

아래 글을 읽다가 문득 Platform SDK의 경로에 대해서 떠오르게 되었고, 프로젝트 설정에서
어떤 곳에도 include를 설정해 놓은곳이 없었다는 점이 떠올랐다.

[발견 : http://social.msdn.microsoft.com/forums/en-US/vcgeneral/thread/0300699f-4f0d-46dc-9c47-c4f5f0a2356b]

그리고 나머지 에러는 undefined 에러 이므로.. 오리지널 소스와 비교해서 차이점을 보면 어떻게 될 듯 하고,
문제는 Scintilla 에서 선언된 것들을 끌어 오는 문제인데.. 아마도 프로젝트 환경 설정과 컴파일러 버전 차이로
/Wp64 /GS- /GF 이 세가지 옵션을 인식 못하는게 원인이라고 생각이 된다.

Visual C++ 컴파일러 옵션 /GS(버퍼 보안 검사)
[출처 : http://msdn.microsoft.com/ko-kr/library/8dbf701c.aspx]

Visual C++ 컴파일러 옵션 /GF(중복 문자열 제거)
[출처 : http://msdn.microsoft.com/ko-kr/library/s0s0asdt.aspx]



이 페이지에서 다루는 특정 제품:.
Microsoft Visual Studio 2008/.NET Framework 3.5

다음 제품들은 다른 버전에서 다루어 집니다.

이래저래.. 그냥 VC++ 6.0을 쓰지 말아야 하는 건가 ㄱ-


그리고 에러 중에 COLOR_HOTLIGHT 를 찾지 못하는 것이 있는데
이 녀석은 windows.h에서 include 하는 winuser.h에 정의 되어 있다고 한다.

COLOR_HOTLIGHT
26

Color for a hyperlink or hot-tracked item.


Requirements

Minimum supported clientWindows 2000 Professional
Minimum supported serverWindows 2000 Server
HeaderWinuser.h (include Windows.h)
LibraryUser32.lib
DLLUser32.dll

[출처 : http://msdn.microsoft.com/en-us/library/ms724371(VS.85).aspx]


그래서 내 꺼에서 파일을 봤더니..
#if(WINVER >= 0x0500)
#define COLOR_HOTLIGHT          26

헉.. 설마 CODEWIZ 님의 삽질을 유발했던 저 써글넘의 WINVER이 문제인건가 -ㅁ-!
[codewiz님의 삽질기 : http://www.jiniya.net/tt/635]


아무튼.. 소스 상에서는
#define _WIN32_WINNT 0x501 로 선언되어 있는데, 이 경우 컴파일 하면...
Notepad2.exe - 170 error(s), 41 warning(s)

이 녀석이 존재하는
Searching for '#define _WIN32_WINNT 0x501'...
C:\cvsdown\np2src_VC6\src\Dialogs.c(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Dlapi.c(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Edit.c(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Helpers.c(22):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Notepad2.c(21):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Print.cpp(21):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\SciWrap.cpp(20):#define _WIN32_WINNT 0x501
C:\cvsdown\np2src_VC6\src\Styles.c(20):#define _WIN32_WINNT 0x501
8 occurrence(s) have been found.
8 녀석에게 일일이
#define WINVER 0x501 을 추가 하면
Notepad2.exe - 75 error(s), 33 warning(s)

우와~ 에러가 100개가 줄었어요 >_< (젠장!)
디버그의 신 : 너에게는 아직 100개가 줄은 것이 아니라 75개의 버그가 남은 것이란다~


잠시 검색을 했더니.. OTL 역시 적당하게 좀 더 게을렀어야 했다.

Visual C++ 2008을 시작하면 Visual C++는 Windows 95, Windows 98, Windows ME 또는 Windows NT를 지원하지 않습니다. WINVER 또는 _WIN32_WINNT 매크로를 이러한 Windows 버전 중 하나에 할당하면 해당 매크로를 수정해야 합니다. 이전 버전의 Visual C++에서 만든 프로젝트를 업그레이드하는 경우 WINVER 또는 _WIN32_WINNT 매크로를 더 이상 지원되지 않는 Windows 버전에 할당하면 해당 매크로와 관련된 컴파일 오류가 발생합니다.

해당 매크로를 수정하려면 헤더 파일에 다음 줄을 추가합니다.

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

이렇게 하면 Windows 2000 운영 체제를 대상으로 합니다. Windows XP, Windows Server 2003 및 Windows Vista에 대한 유효 값은 각각 0x0501, 0x0502 및 0x0600입니다.

/D 컴파일러 옵션을 사용하여 이 매크로를 정의할 수도 있습니다. 자세한 내용은 /D(전처리기 정의)를 참조하십시오.

[출처 : http://msdn.microsoft.com/ko-kr/library/6sehtctf.aspx]



Platfrom SDK가 설치된 상태의 Visual Studio 6.0의 환경설정이다.
문제는 Win32 Platform에 대해서만 존재하고, Microsfot SDK(platform SDK)에 경로가 잡혀 있음에도 불구하고
제대로 파일을 불러 오지 못한 것으로 보인다.

즉, 가장 위의  MIDL 에서 굳이 추가해줄 필요는 없었고, 위의 WINVER 선언만 컴파일 옵션에서 넣어 주면 되었던 것이다.
Posted by 구차니
모종의 음모/Notepad22008. 12. 21. 23:04
BLUE'nLIVE 님에게 Notepad2 VC++ 6.0 버전용을 받아서 컴파일 하려고

VC++ 6.0 깔고
Visual Studio 6.0 SP6 깔고
Platform SDK 도 깔았는데...


여전한 에러

DWORD_PTR 이란 변수명을 인식 못하고
컴파일 옵션중에 /Wp64 /S 를 인식을 못하는데.. 아직까지 해결 방법을 못찾았다.
Posted by 구차니

아랍어의 특징

아랍어는 오른쪽에서 왼쪽으로 씁니다. 획 역시 오른쪽 상단에서 좌측 하단으로 이어지게 됩니다.

한글의 초성/중성/종성과는 다르지만 이전 문자에 따라서 다음 문자의 모양이 달라지는 방식입니다.

그리고 삭제시에도 백스페이스와 delete키가 반대로 적용되는 듯하게 보입니다.

 

윈도우즈 폰트

Arial
Tahoma
Times New Roman
Courier New
Microsoft Sans Serif

에 아랍어 폰트가 내장 되어 있습니다.

[출처 : http://mwultong.blogspot.com/2006/08/arabic-fonts.html]

 

아랍어 조합방법



아랍어는 단독형 /  처음형 / 가운데형 / 말끝형 총 4가지의 자소로 구성되며 일부자소에는 단독형과 말끝형 만 존재합니다.

발음은 모르겠지만.. 아무튼 아랍어 글자 하나가 네가지 형태로 사용되는 것이고,

가장 위의 0x0635(0xFEB9)가 단독형

그 아래의 0xFEBA가 말끝형

그 아래의 0xFEBB가 처음형

그 아래의 0xFEBC가 가운데형 입니다.

모양을 보시면 아시겠지만,  처음형은 오른쪽 끝이 깔끔하고

중간형은 앞뒤로 이어지는 꼬리가 달렸고

말끝형은 오른족 앞에 꼬리가 달렸습니다.

4가지 형이 다 있는 문자가 아닌 경우에는

단순하게 처음형 / 가운데형만 존재하고,

처음형으로 처음형과, 단독형

가운데형으로 가운데형과, 말끝형에 사용합니다.


그리고 번지가 두개인 이유는 앞의 0x0600 번대의 데이터만 사용하고, 0xFE00대의 데이터는

실제로 전송되는것이 아니라 문자를 조합하는데 사용하기 위한 문자코드 입니다.

위에 표시된 부분에서는 단독형의 코드만 존재하고, 앞뒤로는 다른 문자입니다.

즉, 유니코드상으로 0x0600 대의 데이터를 받아서 내부적으로 0xFE00 의 데이터로 변환하여 출력을 해주시면 되겠습니다.

 

그리고 예외 사항으로 분리 문자라는 것이 존재 합니다.

ا

د

ذ

ر

ز

و

이전 문자가 2가지 형만 있는 자소일 경우 분리문자가 되며,

(이 부분은 확실하지 않습니다. 위의 6개만인지는 좀더 확인해보고 수정하겠습니다)

분리문자일 경우에는 이어지는 다음 문자가 가운데형을 쓰는대신 처음형을 써주어야 합니다.

 

다른 예외 사항으로

두가지 문자가 조합되어 생성되는 자소 뒤에도 가운데 형을 써야 하는 경우에도 처음형을 써주어야 합니다.

 

그 실례로

ل ا

가 있으며, 두녀석이 연달아서 나타나면

이 되는것이 아니라

لا

이 됩니다.

 

 

[참고서적  : 알기쉬운 아랍어 입문 /김종도 감수/ 명지출판사, 실용아랍어 / 황의갑,한덕규 지음 / 혜안]

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

유니코드 아랍어 오토마타  (8) 2009.03.05
Posted by 구차니