Programming/C Win32 MFC2008. 12. 30. 00:48
open이 있으면 close가 있는 법. 레지스트리 역시 open / create를 했으면 close를 해주어야 한다.
hKey [in]

A handle to the open key to be closed. The handle must have been opened by the RegCreateKeyEx, RegCreateKeyTransacted, RegOpenKeyEx, RegOpenKeyTransacted, or RegConnectRegistry function.


Remarks

The handle for a specified key should not be used after it has been closed, because it will no longer be valid. Key handles should not be left open any longer than necessary.

The RegCloseKey function does not necessarily write information to the registry before returning; it can take as much as several seconds for the cache to be flushed to the hard disk. If an application must explicitly write registry information to the hard disk, it can use the RegFlushKey function. RegFlushKey, however, uses many system resources and should be called only when necessary.


[RegOpenKey : http://msdn.microsoft.com/en-us/library/ms724895(VS.85).aspx]
[RegCloseKey : http://msdn.microsoft.com/en-us/library/ms724837(VS.85).aspx]
[RegCreateKey : http://msdn.microsoft.com/en-us/library/ms724842(VS.85).aspx]
[RegDeleteKey : http://msdn.microsoft.com/en-us/library/ms724845(VS.85).aspx]
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 구차니
프로그램 사용2008. 12. 29. 16:28
UPX는 실행프로그램을 압축해 주는 유틸리티 입니다.
예를 들어 컴파일한 프로그램의 용량이 500KB 인데 MTD 등에 저장을 해야 해서 용량을 줄이고 싶다면
UPX를 통해 압축을 하면, 프로그램의 용량이 절반 정도로 줄어 듭니다.

C:\cvsdown\upx303w>upx.exe
                       Ultimate Packer for eXecutables
                          Copyright (C) 1996 - 2008
UPX 3.03w       Markus Oberhumer, Laszlo Molnar & John Reiser   Apr 27th 2008

Usage: upx [-123456789dlthVL] [-qvfk] [-o file] file..

Commands:
  -1     compress faster                   -9    compress better
  -d     decompress                        -l    list compressed file
  -t     test compressed file              -V    display version number
  -h     give more help                    -L    display software license
Options:
  -q     be quiet                          -v    be verbose
  -oFILE write output to 'FILE'
  -f     force compression of suspicious files
  -k     keep backup files
file..   executables to (de)compress

Type 'upx --help' for more detailed help.

UPX comes with ABSOLUTELY NO WARRANTY; for details visit http://upx.sf.net

notepad2의 용량이 커서 이것으로 압축을 해보았습니다.
 명령어 : upx.exe -9 -o notepad2_packed.exe notepad2.exe

그랬더니 프로그램의 크기가 절반정도로 줄어 드는군요!
 2008-12-24  오전 12:47           580,096 Notepad2.exe
 2008-12-24  오전 12:47           221,696 Notepad2_packed.exe

알려주신 okto님께 감사의 말씀을 +_+

[링크: http://upx.sourceforge.net/]
Posted by 구차니
개소리 왈왈/영화2008. 12. 28. 23:50
금요일/토요일/일요일 3일은 쉰다는게 참 오랫만인것 같기도 하면서
올해의 마지막 쉬는 날이라는 생각이 드니 찹찹해져 온다.

길게만 느껴진 이유로는
1. 나름 오래 끌어 온 notepad2 수정을 끝내서
2. 원없이 푸욱 잠을 자서
3. 여김없이 애인과 싸워서
이다.

일년 동안 못 잔 잠을 다 한번에 몰아서 잔 느낌인데
원래 생활 패턴이 깨져서 간만에 내 패턴으로 돌아 왔기 떄문이다.
원래의 생활 패던이라 함은
"일요일은 몇시에 자던지 오후 12:00까지 자는" 것을 의미하는데
회사일이다, 마덜의 공습에 빠덜의 어택으로 인해서
주말에 12시 까지 잠을 자지 못한것이 상당히 타격이 컸던 모양이다.

애인이랑 싸운거야.. 내 성격이 참 지랄 맞아서
친구로는 좋지만 애인으로는 바람끼라고 느껴질 만큼 오지랍이 넓은지라..
여전히 나의 개 못줘버린 성격으로 인해서 또 싸우게 되었다.

영하 2도라고 지하철에서 나오던데
2시간이나 밖에서 나를 기다리면서 울고 있으면서 몸 땡떙얼었는데,
얼굴이라도 녹여 줄려고 손으로 뺨을 대는데 한걸음 물러 서는 애인을 보면서
더 이상 아플 가슴이 없을줄 알았는데... 아직도 아프구나.. 싶었다.

결론?
아직 살아 있고, 앞으로도 살아 갈 것이고,
아마도.. 앞으로는 누군가를 정말 내 모든걸 주면서 사랑하지 못할 것이다.
어쩌면 사랑 자체를 하지 못할 것 같다.

'개소리 왈왈 > 영화' 카테고리의 다른 글

간만에 사진 업데이트  (3) 2009.03.20
워낭소리 - Old partner (2009)  (6) 2009.03.08
사기컷이 아닙니다!!  (0) 2009.02.06
나의 천사  (19) 2009.01.17
크리스마스는 기절해서 보냈습니다 =ㅁ=  (6) 2008.12.26
Posted by 구차니
모종의 음모/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 구차니
개소리 왈왈2008. 12. 27. 23:18
간만에 과동기 녀석이
"미안한데.."
로 시작하는 말을 걸어 왔다.

뭥미? 라는 호기심이 발동해서 오랫만에 말을 건녀석이고 게임을 하면서
조금은 건성건성 응답을 하는데, 이거 타수가 100타도 안되는건지 뜨문뜨문 말이 넘어 온다.
아니 전산과 녀석이 이렇게 타자 느린건 아니었고, 이녀석도 날리던 넘인데 바쁜가?
라는 생각을 하면서 그냥 말을 계속 받았다.

"우리 엄마 내일 생신이신데, 내가 지금 바빠서 갈 시간은 없고, 미안한데 통장 좀 빌려줘"

통장을 왜 빌려 달라는지 이해가 안되서 몇번 물었는데도 오히려 자기가 답답하다며 성질을 낸다 ㄱ-
인터넷 뱅킹을 안쓰는 놈들도 없을뿐더러, 자기가 돈이 없어서 그런것도 아니고
뜬금없이 통장을 빌려 주려면 계좌 이체를 할려는건데 그러면 인증서도 줘야 하니
이건 돈 빌려 주는거보다 더 위험한거라고 미안하다고 거절을 했다.



그런데 이거 먼가 미묘하게 이상한 느낌이 드는게
말이 반말,높임말,평말 이 다 섞여 있었다. 그리고 그 넘의 평소 말투가 아니었다!

그래서 메신저로 대화 끝나고 그 녀석의 전화로 했더니 이미 몇명이서 전화가 왔는지
"나 아니야~" 로 전화를 시작했다 ^^;


아무튼 네이트온 계정을 해킹해서(장시간 사용안했다고 한 것 봐서는 SK 서버 해킹을 당했을 우려도?)
계정에 친구 추가 되어 있는 지인들에게 통장을 빌려 달라고 하는 피싱을 시도 하니, msn 은 거금을 빌려 달라하는
사례에 비추어 봤을때 유사성이 있어 보인다.

일반적으로 이런 경우에 조선족이 끼게 되는데, 비록 중국에서 중국교육에 의해서 중국인화 되었지만
그래도 조선족이라고 한다면 제발 한국사람들 사기쳐먹는 행동만은 안했으면 하는 생각이 든다.
Posted by 구차니
Linux2008. 12. 26. 16:18
find 라는 명령어는 -exec 라는 옵션을 사용하여 파이프라인을 통해 검색된 결과를 넘겨 줄 수 있다.

윈도우/리눅스를 혼합하여 사용할 경우 의미 없이 용량만 늘리는 Thumbs.db 라는 넘을 삭제 하고 싶은데
일일이 찾아 지우기는 귀찮으니 조금 더 귀차니즘을 발휘하여 find에게 떠밀어 보자

 find [start path] -name Thumbs.db -exec rm {} \;

{} 는 검색된 결과가 넘어 가는 것이고
\; 는 명령어의 끝을 나타낸다. {}는 붙여 써야 하고(치환자)
\;역시 붙여 써야 하되, {} \;는 띄워서 써야 한다.


[참고 : http://kin.naver.com/detail/detail.php?d1id=1&dir_id=10202&eid=uOUzGMEfvG/Z2+VmcTxiS3R/sb6P15T+&qb=ZmluZCBleGVj&pid=fSfZswoi5URssbZwiR4sss--173216&sid=SVSD7S1zVEkAACzVjnk]
Posted by 구차니
Programming/C Win32 MFC2008. 12. 26. 10:45
구글링을 하면서 찾아 보니
GetCurrentDirectory라는 Win32 API가 존재 하는데,
이녀석으로 할 경우 FILE dialog에서 경로를 변경시 다른 경로가 나올 우려가 있다고 한다.

그래서 GetModuleFileName 이라는 함수를 사용하라는데,
먼소리여 -ㅁ-!

[참조 : http://cbuilder.borlandforum.com/impboard/impboard.dll?action=read&db=bcb_tip&no=806]

Code:
char path[MAX_PATH];
GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
MessageBox(NULL, path, NULL, NULL);

[출처 : http://www.codeguru.com/forum/showthread.php?threadid=462232]


Run-Time Library Reference
_pgmptr, _wpgmptr
The path of the executable file. Deprecated; use _get_pgmptr and _get_wpgmptr.

Variable Required header Compatibility

_pgmptr, _wpgmptr

<stdlib.h>

Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003, Windows Server 2003

좀 더 간단한 녀석이 있어 보인다.

[원본 : http://msdn.microsoft.com/en-us/library/tza1y5f7(VS.80).aspx]



간단한 테스트 결과

1. VC++ 6.0 컴파일 환경 설정

2. 소스코드 작성
#include <windows.h>

void main()
{
    char path[MAX_PATH];
    GetModuleFileName(GetModuleHandle(NULL), path, MAX_PATH);
    printf("path[%s]\n",path);
    GetCurrentDirectory(MAX_PATH,path);
    printf("path[%s]\n",path);
}

3. 결과
path[C:\Documents and Settings\morpheuz\바탕 화면\tt\Debug\t.exe]
path[C:\]
Press any key to continue


Posted by 구차니
Microsoft/Windows2008. 12. 26. 01:18
머하는 녀석인지 몰라도..
결론만 말하자면 이녀석을 켜 놓으면

WinXP로 설치시 하드를 인식 못한다.



확인 기종은 삼보 에버라텍 4600, SATA2 인데,
이녀석은 EIDE 용이 아닌 SATA 관련된 기능으로, BIOS 상에서도 WindowsXP 관련하여
XP 쓸경우 AHCI Support 를 Disable 하라고 해 놓았으니, 머.. 할말은 없다.

검색을 해보니

The Advanced Host Controller Interface (AHCI) is a hardware mechanism that allows software to communicate with Serial ATA (SATA) devices (such as host bus adapters) that are designed to offer features not offered by Parallel ATA (PATA) controllers, such as hot-plugging and native command queuing.

Common problems switching to AHCI under Windows

Enabling AHCI in a system's BIOS will cause a 0x7B Blue Screen of Death STOP error (INACCESSIBLE_BOOT_DEVICE) on installations of Windows XP where AHCI/RAID drivers for that system's chipset are not installed - i.e. boot failure.[citation needed] Switching the chipset to AHCI mode involves changing the BIOS settings and will not work. Usually, manual installation of new drivers is required before enabling AHCI in BIOS.[5] Alternatively, a "Repair" installation with the appropriate driver loaded during the setup process usually corrects the problem. For motherboards with more than one Sata controller (for example, some boards have Intel and Jmicron Sata controllers) another alternative is possible. The sata cable for the boot drive can be inserted into a port on one controller (which can be configured in IDE mode), allowing the machine to boot successfully with the other controller configured for AHCI mode. The AHCI drivers can then be installed in windows without difficulty before swapping the cable back.
  • For Intel chipsets (for example, Intel ICH9) drivers are available from either an OEM motherboard or computer manufacturer. For the Intel versions, the driver must be loaded before loading the OS (by pressing F6 as setup starts, then using the floppy disk when prompted).The Intel drivers will work for both XP and Vista. Also, in the case of ICH9, an unsupported method to enable AHCI on ICH9 is available.
  • When attempting to install Windows XP or a previous version on an AHCI-enabled system, setup will fail with the error message "setup could not detect hard disk drive..." since no drivers will be found for accessing the SATA controller/s. This problem can be corrected by either using a floppy disk or by slipstreaming the appropriate drivers into the Windows XP installation CD, or by turning on IDE emulation in the BIOS settings if it's available (usually labelled COMPATIBILITY or ACPI).
  • Enabling AHCI in a system with Windows Vista already installed will result in a BSoD if SATA was configured in IDE mode during Vista's installation. Before enabling AHCI in the BIOS, users must first follow the instructions found at Microsoft Knowledge Base article 922976.
  • Enabling AHCI in a system BIOS on installations of Windows XP or Windows Vista will cause SATA Optical drives to disappear. A Hotfix for Windows Vista is available under the title: "SATA optical drives are not available after you start a Windows Vista-based computer."[6] This problem was fixed in Vista SP1.

아마도 회사에서 에버라텍 4600 Vista 가 자꾸 죽는 이유가 다른게 아니라 AHCI 문제였던 것 같은데.. 부팅시에 죽는게 아니라 가동중에 이유없이(메신저 하거나, 네트워크 통해 복사 중) 죽는 것 봐서는 네트워크 드라이버 문제일 가능성이 좀더 높아 보이지만, 테스트 기간이 짧아서 확실하게 단언하긴 힘들다.
[출처 : http://en.wikipedia.org/wiki/Advanced_Host_Controller_Interface]


ACPI가 먼지 궁금해서 한번 찾아 봤다.

The Advanced Configuration and Power Interface (ACPI) specification is an open standard for unified operating system-centric device configuration and power management. ACPI, first released in December 1996, defines platform-independent interfaces for hardware discovery, configuration, power management and monitoring.
[출처 : http://en.wikipedia.org/wiki/Acpi]
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 구차니