아래는 frhed 프로그램의 레지스트리 등록 부분의 소스이다.

    case IDM_CONTEXT:
        if (MF_CHECKED == GetMenuState(hMenu, IDM_CONTEXT, 0))
        {
           //WinNT requires the key to have no subkeys
            RegDeleteKey(HKEY_CLASSES_ROOT, "*\\shell\\Open in frhed\\command");
            RegDeleteKey(HKEY_CLASSES_ROOT, "*\\shell\\Open in frhed");
        }
        else
        {
            HKEY key1;
            LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
                "*\\shell\\Open in frhed\\command",
                &key1);
            if (res == ERROR_SUCCESS)
            {
                char cmd[MAX_PATH];
                int len = sprintf(cmd, "%s %%1", _pgmptr);
                RegSetValue(key1, NULL, REG_SZ, cmd, len);
            }
        }
        break;
    case IDM_UNKNOWN:
        if (MF_CHECKED == GetMenuState(hMenu, IDM_UNKNOWN, 0))
        {
            HKEY hk;
            //WinNT requires the key to have no subkeys
            RegDeleteKey(HKEY_CLASSES_ROOT, "Unknown\\shell\\Open in frhed\\command");
            RegDeleteKey(HKEY_CLASSES_ROOT, "Unknown\\shell\\Open in frhed");
            if (ERROR_SUCCESS == RegOpenKey(HKEY_CLASSES_ROOT, "Unknown\\shell", &hk))
            {
                RegDeleteValue(hk, NULL);
                RegCloseKey(hk);
            }
        }
        else
        {
            HKEY key1;
            LONG res = RegCreateKey(HKEY_CLASSES_ROOT,
                "Unknown\\shell\\Open in frhed\\command",
                &key1);
            if (res == ERROR_SUCCESS)
            {
                char cmd[MAX_PATH];
                int len = sprintf(cmd, "%s %%1", _pgmptr);
                RegSetValue(key1, NULL, REG_SZ, cmd, len);
            }
        }
        break;
    case IDM_DEFAULT:
        if (MF_CHECKED == GetMenuState(hMenu, IDM_DEFAULT, 0))
        {
            HKEY hk;
            if (ERROR_SUCCESS == RegOpenKey(HKEY_CLASSES_ROOT, "Unknown\\shell", &hk))
            {
                RegDeleteValue(hk, NULL);
                RegCloseKey(hk);
            }
        }
        else
        {
            RegSetValue(HKEY_CLASSES_ROOT, "Unknown\\shell", REG_SZ, "Open in frhed", 13);
        }
        break;


notepad2의 아쉬운점이 컨텍스트 메뉴를 지원하지 않는 다는 점이었는데, 이 부분을 응용하여 적용하면
notepad2의 효용이 200배는 증가 할 듯 하다.
신고
Posted by 구차니

댓글을 달아 주세요

  1. 음... 원하는 포맷에 대해 이런 메뉴를 달면 무지 좋겠군요. 그런데 프로그래밍 지식이 없어서 어떻게 다는줄 몰라영~ㅠㅠ

    2008.12.18 17:16 신고 [ ADDR : EDIT/ DEL : REPLY ]
    • 조금 쉽게 생각하면
      빵집 제작자 님을 협박해서(!) 빵집의 인터페이스를 끌어다가 연결하면 막강해지지 않을까 라는 위험한 발상이 떠올랐습니다 ㅋㅋ

      모든 파일에 대해서 연결을 하니 너무 좋네요 ㅠ.ㅠ
      Acroedit은 노트북에서 조금 구동이 느려서 notepad2로 대체 해놓고 쓰고 있습니다.

      2008.12.18 17:29 신고 [ ADDR : EDIT/ DEL ]
    • 여담이지만 빵집 제작자님은 요근래 무지하게 바쁘신것 같더군요. 빵집4도 1년 넘게 연기되고 있고... 그래도 틈틈히 시간을 내어 개발하시는것 같아 조르지도 못하겠더라능...

      2008.12.18 17:37 신고 [ ADDR : EDIT/ DEL ]
    • 헉! 빵집 제작자님도 친하신가봐요? 개발업계의 마당발이신가봐요 ㅎㅎ

      2008.12.18 17:46 신고 [ ADDR : EDIT/ DEL ]
    • 전~~혀 안친해요ㅋ
      워낙 눈치없이 조르는걸 좋아해서 아무한테나 엉겨붙는거죠 뭐ㅋㅋㅋ

      2008.12.18 17:49 신고 [ ADDR : EDIT/ DEL ]

굳이 c언어에서 파일의 길이를 알아내려면

  fseek(file,0,SEEK_END);
  len = ftell(file);
  rewind(file);

명령어의 조합으로 알아 낼수 있지만.. 느린거 같기도 하고. 그래서 다른 방법을 찾아 보았더니
linux에서는 stat 라는 함수가 있는데, 이것을 이용하면 파일의 상태를 얻어 올 수 있다.

char filename[];
struct stat statinfo;
stat(filename, &statinfo);
len = statinfo.st_size;

그리고 fstat로도 해봤는데
fp = fopen();
fstat(fp,&statinfo);
으로는 안되었다. 아무래도 타입이 다르거나 아니면 FILE 구조체의 다른 변수를 사용해야 할듯 하다.
이미 열어 놓은 파일이라면 fstat로 하는게 훨씬 빠르게 작동이 가능할 듯 하다.


#include <
sys/stat.h>

int stat(const char *path, struct stat *buf);
int fstat(int filedes, struct stat *buf);
int lstat(const char *path, struct stat *buf);

struct stat {
    dev_t     st_dev;     /* ID of device containing file */
    ino_t     st_ino;     /* inode number */
    mode_t    st_mode;    /* protection */
    nlink_t   st_nlink;   /* number of hard links */
    uid_t     st_uid;     /* user ID of owner */
    gid_t     st_gid;     /* group ID of owner */
    dev_t     st_rdev;    /* device ID (if special file) */
    off_t     st_size;    /* total size, in bytes */
    blksize_t st_blksize; /* blocksize for filesystem I/O */
    blkcnt_t  st_blocks;  /* number of blocks allocated */
    time_t    st_atime;   /* time of last access */
    time_t    st_mtime;   /* time of last modification */
    time_t    st_ctime;   /* time of last status change */
};

[출처 : http://linux.die.net/man/2/stat]

 

신고
Posted by 구차니

댓글을 달아 주세요

  1. llew

    fp = fopen();
    fstat(fileno(fp),&statinfo);


    ---------------------
    fileno(fp) 로 파일 포인터를 파일 디스크립트로 바꾸니 되네요

    2012.08.13 15:47 신고 [ ADDR : EDIT/ DEL : REPLY ]