Microsoft MVP성태의 닷넷 이야기
글쓴 사람
김종욱
홈페이지
첨부 파일
 
부모글 보이기/감추기

/// 헤더파일
// FileList.h : CFileList의 선언입니다.
#pragma once
#include "resource.h" // 주 기호입니다.
#include <atlctl.h>
#include "HttpFileList.h"

// CFileList
class ATL_NO_VTABLE CFileList :
    public CComObjectRootEx<CComSingleThreadModel>,
    public IDispatchImpl<IFileList, &IID_IFileList, &LIBID_HttpFileListLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,
    public IPersistStreamInitImpl<CFileList>,
    public IOleControlImpl<CFileList>,
    public IOleObjectImpl<CFileList>,
    public IOleInPlaceActiveObjectImpl<CFileList>,
    public IViewObjectExImpl<CFileList>,
    public IOleInPlaceObjectWindowlessImpl<CFileList>,
    public ISupportErrorInfo,
    public IPersistStorageImpl<CFileList>,
    public ISpecifyPropertyPagesImpl<CFileList>,
    public IQuickActivateImpl<CFileList>,
    public IDataObjectImpl<CFileList>,
    public IProvideClassInfo2Impl<&CLSID_FileList, NULL, &LIBID_HttpFileListLib>,
    public CComCoClass<CFileList, &CLSID_FileList>,
    public CComCompositeControl<CFileList>
{
private:
    char* m_path;
    int dirIndex;
    HIMAGELIST hSmIcon;
    HMENU m_hMenuPopup, m_hMenuRight;
public:
    

    CFileList()
    {
        m_bWindowOnly = TRUE;
        CalcExtent(m_sizeExtent);
        m_path = new char[200];
        dirIndex = 0;

        m_hMenuPopup = LoadMenu(_AtlBaseModule.GetResourceInstance(), MAKEINTRESOURCE(IDR_MENU1));
        if(m_hMenuPopup == NULL) {
            _ASSERTE(FALSE);
        }

        m_hMenuRight = GetSubMenu(m_hMenuPopup,0);
        if(m_hMenuRight == NULL) {
            _ASSERTE(FALSE);
        }

    }

DECLARE_OLEMISC_STATUS(OLEMISC_RECOMPOSEONRESIZE |
    OLEMISC_CANTLINKINSIDE |
    OLEMISC_INSIDEOUT |
    OLEMISC_ACTIVATEWHENVISIBLE |
    OLEMISC_SETCLIENTSITEFIRST
)

DECLARE_REGISTRY_RESOURCEID(IDR_FILELIST)

BEGIN_COM_MAP(CFileList)
    COM_INTERFACE_ENTRY(IFileList)
    COM_INTERFACE_ENTRY(IDispatch)
    COM_INTERFACE_ENTRY(IViewObjectEx)
    COM_INTERFACE_ENTRY(IViewObject2)
    COM_INTERFACE_ENTRY(IViewObject)
    COM_INTERFACE_ENTRY(IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceObject)
    COM_INTERFACE_ENTRY2(IOleWindow, IOleInPlaceObjectWindowless)
    COM_INTERFACE_ENTRY(IOleInPlaceActiveObject)
    COM_INTERFACE_ENTRY(IOleControl)
    COM_INTERFACE_ENTRY(IOleObject)
    COM_INTERFACE_ENTRY(IPersistStreamInit)
    COM_INTERFACE_ENTRY2(IPersist, IPersistStreamInit)
    COM_INTERFACE_ENTRY(ISupportErrorInfo)
    COM_INTERFACE_ENTRY(ISpecifyPropertyPages)
    COM_INTERFACE_ENTRY(IQuickActivate)
    COM_INTERFACE_ENTRY(IPersistStorage)
    COM_INTERFACE_ENTRY(IDataObject)
    COM_INTERFACE_ENTRY(IProvideClassInfo)
    COM_INTERFACE_ENTRY(IProvideClassInfo2)
END_COM_MAP()

BEGIN_PROP_MAP(CFileList)
    PROP_DATA_ENTRY("_cx", m_sizeExtent.cx, VT_UI4)
    PROP_DATA_ENTRY("_cy", m_sizeExtent.cy, VT_UI4)
    // 예제 항목
    // PROP_ENTRY("Property Description", dispid, clsid)
    // PROP_PAGE(CLSID_StockColorPage)
END_PROP_MAP()


BEGIN_MSG_MAP(CFileList)
    MESSAGE_HANDLER(WM_INITDIALOG, OnInitDialog)
    NOTIFY_HANDLER(IDC_LIST, NM_DBLCLK, OnNMDblclkList)
    MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
    NOTIFY_HANDLER(IDC_LIST, NM_RCLICK, OnNMRclickList)
/* 이 메시지 입니다 */
    COMMAND_ID_HANDLER(ID_FILECOMMAND_DOWN, OnFilecommandDown)
    COMMAND_ID_HANDLER(ID_FILECOMMAND_UPLOAD, OnFilecommandUpload)
    CHAIN_MSG_MAP(CComCompositeControl<CFileList>)
END_MSG_MAP()

// 처리기 프로토타입:
// LRESULT MessageHandler(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// LRESULT CommandHandler(WORD wNotifyCode, WORD wID, HWND hWndCtl, BOOL& bHandled);
// LRESULT NotifyHandler(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);

BEGIN_SINK_MAP(CFileList)
    // 이벤트 처리기는 __stdcall 호출 규칙을 사용해야 합니다.
END_SINK_MAP()

    STDMETHOD(OnAmbientPropertyChange)(DISPID dispid)
    {
        if (dispid == DISPID_AMBIENT_BACKCOLOR)
        {
            SetBackgroundColorFromAmbient();
            FireViewChange();
        }
        return IOleControlImpl<CFileList>::OnAmbientPropertyChange(dispid);
    }
// ISupportsErrorInfo
    STDMETHOD(InterfaceSupportsErrorInfo)(REFIID riid)
    {
        static const IID* arr[] =
        {
            &IID_IFileList,
        };

        for (int i=0; i<sizeof(arr)/sizeof(arr[0]); i++)
        {
            if (InlineIsEqualGUID(*arr[i], riid))
                return S_OK;
        }
        return S_FALSE;
    }

// IViewObjectEx
    DECLARE_VIEW_STATUS(VIEWSTATUS_SOLIDBKGND | VIEWSTATUS_OPAQUE)

// IFileList

    enum { IDD = IDD_FILELIST };

    DECLARE_PROTECT_FINAL_CONSTRUCT()

    HRESULT FinalConstruct()
    {
        return S_OK;
    }
    
    void FinalRelease()
    {
    }
    LRESULT OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
    char* HttpRequest(char* path);
    char* GetRequest(char* path2);
    char* GetRequestParent(void);
    void realPath(char* data);
    void Parsing(char* data);
    int GetIndex(char* filename);
    LRESULT OnNMDblclkList(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/);
    LRESULT OnThemeChanged(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
    LRESULT OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/);
    LRESULT OnNMRclickList(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/);
/* 이 함수가 작동 안됩니다 */
    LRESULT OnFilecommandDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);

    LRESULT OnFilecommandUpload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/);
};

OBJECT_ENTRY_AUTO(__uuidof(FileList), CFileList)


/////// 소스 화일입니다
// FileList.cpp : CFileList의 구현입니다.
#include "stdafx.h"
#include "FileList.h"
#include ".\filelist.h"


// CFileList

LRESULT CFileList::OnInitDialog(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.

    SHFILEINFO sfi;
    hSmIcon = (HIMAGELIST) SHGetFileInfo ((LPCSTR) "C:\\", 0, &sfi, sizeof (SHFILEINFO),SHGFI_USEFILEATTRIBUTES | SHGFI_SYSICONINDEX | SHGFI_SMALLICON );
    SendDlgItemMessage(IDC_LIST,LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, (LPARAM)hSmIcon);
    HWND hFileList = GetDlgItem(IDC_LIST);
    ListView_SetExtendedListViewStyle(hFileList, LVS_EX_FULLROWSELECT);


    LVCOLUMN COL;
    COL.mask = LVCF_FMT | LVCF_WIDTH | LVCF_TEXT | LVCF_SUBITEM;
    COL.fmt = LVCFMT_LEFT;
    COL.cx = 150;
    COL.pszText = "파일명";
    COL.iSubItem = 0;
    SendDlgItemMessage(IDC_LIST, LVM_INSERTCOLUMN, 0, (LPARAM)&COL);

    COL.pszText = "종류";
    COL.cx = 150;
    COL.iSubItem = 1;
    SendDlgItemMessage(IDC_LIST, LVM_INSERTCOLUMN, 1, (LPARAM)&COL);

    COL.pszText = "파일크기";
    COL.cx = 150;
    COL.iSubItem = 2;
    SendDlgItemMessage(IDC_LIST, LVM_INSERTCOLUMN, 2, (LPARAM)&COL);

    COL.pszText = "접속시간";
    COL.cx = 150;
    COL.iSubItem = 3;
    SendDlgItemMessage(IDC_LIST, LVM_INSERTCOLUMN, 3, (LPARAM)&COL);
    
    Parsing(HttpRequest("root"));
    return TRUE;
}

char* CFileList::HttpRequest(char* path)
{
    char* request = new char[65000];
    request = GetRequest(path);

    HINTERNET hInternet, hHttp, hReq;
    DWORD size;
    char buf[65000] = {0, };
    char buf2[65000] = {0, };
    DWORD dwRead;

    hInternet = InternetOpen("HTTPTEST", INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
    if(hInternet == NULL) return 0;;

    hHttp = InternetConnect(hInternet, "wpdoti.new21.net",0,"","",INTERNET_SERVICE_HTTP,0,0);
    if(hHttp == NULL) return 0;

    hReq = HttpOpenRequest(hHttp,"GET",request,NULL,NULL,NULL,0,0);
    HttpSendRequest(hReq,NULL,0,NULL,0);

    do{
        InternetQueryDataAvailable(hReq,&size,0,0);
        InternetReadFile(hReq, buf, size, &dwRead);
        buf[dwRead] = 0;
        strcat(buf2,buf);
    }while(dwRead != 0);

    char *result = new char[65000];
    strcpy(result, buf2);
    InternetCloseHandle(hHttp);
    InternetCloseHandle(hInternet);
    hHttp = NULL;
    hInternet = NULL;

    return result;
}

char* CFileList::GetRequest(char* path2)
{
    char re[65000] = {0,};

    if(strcmp(path2, "root") == 0){
        strcpy(re, "webhard/fileecho.php?mode=file");
    }else{
        strcpy(re, "webhard/fileecho.php?mode=file");
        strcat(re, "&dir=");
        strcat(re, m_path);
        strcat(re, path2);
    }
    char* re2 = new char[65000];
    strcpy(re2, re);
    return re2;
}

char* CFileList::GetRequestParent(void)
{
    char re[65000] = {0,};
    char* r = new char[65000];
    int i, tempcount = 0, count =0, cmp = 0;
    for(i=0; m_path[i]; i++) if(m_path[i] == '/') count++;
    for(i=0; m_path[i]; i++){
        if(m_path[i] == '/') cmp++;
        if(cmp == count-1) break;
        r[tempcount++] = m_path[i];
    }
    r[tempcount] = '\0';

    strcpy(re, "webhard/fileecho.php?mode=file");
    strcat(re, "&dir=");
    strcat(re, r);

    char* re2 = new char[65000];
    strcpy(re2, re);
    return re2;
}

void CFileList::realPath(char* data)
{
    char temp[200] = {0,};
    int count = 0;
    for(int i=0;data[i]; i++){
        if(data[i] == '!') for(i++; data[i] != '!'; i++) temp[count++] = data[i];
    }
    temp[count] = 0;
    m_path = new char[200];
    strcpy(m_path, temp);
}

void CFileList::Parsing(char* data)
{
    dirIndex = 0;
    char temp[30];
    int count = 0;
    int mode = 0;

    LVITEM LI;
    int listCount = 0;
    char filename[30];
    char filesize[30];
    char filedate[30];
    realPath(data);

    SendDlgItemMessage(IDC_LIST, LVM_DELETEALLITEMS, NULL, NULL);
    if(strcmp(m_path,"./data/") != 0){
        strcpy(filename,"..");
        LI.mask = LVIF_TEXT | LVIF_IMAGE;
        LI.iItem = listCount++;
        LI.iImage = 0;
        LI.iSubItem = 0;
        LI.pszText = filename;
        SendDlgItemMessage(IDC_LIST, LVM_INSERTITEM, 0, (LPARAM)&LI);
        dirIndex++;
    }

    for(int i=0;data[i]; i++){
        if(data[i] == '{'){
            for(i++; data[i] != '}'; i++){
                if(data[i] == '#'){
                    for(i++; data[i] != '#'; i++){
                        count = 0;
                        if(data[i] == '%'){
                            mode = 1;
                            for(i++; data[i] != '%'; i++) temp[count++] = data[i];
                        }else if(data[i] == '&'){
                            mode = 4;
                            for(i++; data[i] != '&'; i++) temp[count++] = data[i];
                        }
                        temp[count] = '\0';

                        switch(mode){
                            case 1:
                                strcpy(filename, temp);
                                break;
                            case 4:
                                strcpy(filedate, temp);
                                break;
                        }
                    }

                    LI.mask = LVIF_TEXT | LVIF_IMAGE;
                    LI.iItem = listCount;
                    LI.iImage = GetIndex("dir");
                    LI.iSubItem = 0;
                    LI.pszText = filename;
                    SendDlgItemMessage(IDC_LIST, LVM_INSERTITEM, 0, (LPARAM)&LI);
                    LI.iImage = -1;
                    LI.iSubItem = 2;
                    LI.pszText = " ";
                    SendDlgItemMessage(IDC_LIST, LVM_SETITEM, 0, (LPARAM)&LI);
                    LI.iSubItem = 3;
                    LI.iImage = -1;
                    LI.pszText = filedate;
                    SendDlgItemMessage(IDC_LIST, LVM_SETITEM, 0, (LPARAM)&LI);
                    listCount++;
                    dirIndex++;
                }

                if(data[i] == '@'){
                    for(i++; data[i] != '@'; i++){
                        count = 0;
                        if(data[i] == '%') for(i++; data[i] != '%'; i++){
                            mode =1;
                            temp[count++] = data[i];
                        }else if(data[i] == '$') for(i++; data[i] != '$'; i++){
                            mode = 3;
                            temp[count++] = data[i];
                        }else if(data[i] == '&') for(i++; data[i] != '&'; i++){
                            mode = 4;
                            temp[count++] = data[i];
                        }
                        temp[count] = '\0';

                        switch(mode){
                            case 1:
                                strcpy(filename, temp);
                                break;
                            case 3:
                                strcpy(filesize, temp);
                                break;
                            case 4:
                                strcpy(filedate, temp);
                                break;
                        }
                    }

                    LI.mask = LVIF_TEXT | LVIF_IMAGE;
                    LI.iItem = listCount;
                    LI.iImage = GetIndex(filename);
                    LI.iSubItem = 0;
                    LI.pszText = filename;
                    SendDlgItemMessage(IDC_LIST, LVM_INSERTITEM, 0, (LPARAM)&LI);

                    LI.mask = LVIF_TEXT;
                    LI.iImage = -1;
                    LI.iSubItem = 2;
                    LI.pszText = filesize;
                    SendDlgItemMessage(IDC_LIST, LVM_SETITEM, 0, (LPARAM)&LI);
                    LI.iSubItem = 3;
                    LI.iImage = -1;
                    LI.pszText = filedate;
                    SendDlgItemMessage(IDC_LIST, LVM_SETITEM, 0, (LPARAM)&LI);
                    listCount++;
                }
            }
        }
    }
}

int CFileList::GetIndex(char* filename)
{
    SHFILEINFO sfi;
    ::ZeroMemory (&sfi, sizeof (sfi));

    DWORD dwStyle = SHGFI_SMALLICON | SHGFI_SYSICONINDEX | SHGFI_USEFILEATTRIBUTES ;
    if(strcmp(filename, "dir") == 0){
        SHGetFileInfo ( "*", FILE_ATTRIBUTE_DIRECTORY, &sfi, sizeof(sfi), dwStyle);
    }else SHGetFileInfo ( filename, FILE_ATTRIBUTE_NORMAL, &sfi, sizeof(sfi), dwStyle);

    return sfi.iIcon;
}

LRESULT CFileList::OnNMDblclkList(int /*idCtrl*/, LPNMHDR pNMHDR, BOOL& /*bHandled*/)
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    char name[200];
    int SelectItem = -1;

    HWND hList = pNMHDR->hwndFrom;
    SelectItem = ListView_GetNextItem(hList, SelectItem, LVNI_SELECTED);
    if(SelectItem < dirIndex && SelectItem != -1){
            ListView_GetItemText(hList,SelectItem,0, name, 200);
    
            if(strcmp(name, "..") == 0) Parsing(HttpRequest(GetRequestParent()));
            else Parsing(HttpRequest(GetRequest(name)));
    }
    return 0;
}


LRESULT CFileList::OnDestroy(UINT /*uMsg*/, WPARAM /*wParam*/, LPARAM /*lParam*/, BOOL& /*bHandled*/)
{
    // TODO: 여기에 메시지 처리기 코드를 추가 및/또는 기본값을 호출합니다.
    SendDlgItemMessage(IDC_LIST,LVM_SETIMAGELIST, (WPARAM)LVSIL_SMALL, NULL);
    return 0;
}

LRESULT CFileList::OnNMRclickList(int /*idCtrl*/, LPNMHDR pNMHDR , BOOL& /*bHandled*/)
{
    // TODO: 여기에 컨트롤 알림 처리기 코드를 추가합니다.
    POINT pt;
    GetCursorPos(&pt);
    TrackPopupMenuEx(m_hMenuRight, TPM_VERTICAL, pt.x, pt.y, pNMHDR->hwndFrom, NULL);
    return 0;
}

/* 여기서 작동이 안됩니다 */

#include "DownLoad.h"
LRESULT CFileList::OnFilecommandDown(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    // TODO: 여기에 명령 처리기 코드를 추가합니다.

    MessageBox("ddd");
    
    return 0;
}

LRESULT CFileList::OnFilecommandUpload(WORD /*wNotifyCode*/, WORD /*wID*/, HWND /*hWndCtl*/, BOOL& /*bHandled*/)
{
    // TODO: 여기에 명령 처리기 코드를 추가합니다.

    MessageBox("ddd");
    return 0;
}



/////////////////////
잘 몰라서 문제가 되고 있는 헤더와 소스파일 전문을 올립니다








[최초 등록일: ]
[최종 수정일: 4/13/2016]


비밀번호

댓글 작성자
 




... 61  62  63  64  65  66  67  68  69  70  71  72  73  74  [75]  ...
NoWriterDateCnt.TitleFile(s)
674황태욱7/5/200716465utf-8 환경에서 파라미터 값에 한글이 있을 경우 깨지는 현상이.. [1]
672땡초7/4/200715687Remoting 객체를 호출하는 순간 Timer 의 Elapsed 이벤트가 멈추는 현상 [2]
670조성택7/3/200715082.Net에서 Timer클래스.. [1]
667홍석헌6/29/200714333[c#] 윈도우 활성화에 관한 질문
669정성태6/30/200714652    답변글 [답변]: [c#] 윈도우 활성화에 관한 질문
666오야6/25/200713388System.Transactions 에서 트랜잭션 실패를 체크하는 방법 [1]
665김성태6/20/200713023안녕하세요^^
668정성태6/30/200714273    답변글 [답변]: 안녕하세요^^
663모름이6/19/200712603Microsoft.Framework 에서 OLE DB 사용하려면.. [1]
664모름이6/20/200713583    답변글 [추가질문]: 다른 OLE DB 를 사용하려면..
662조성택6/13/200714153C#에서 string클래스.. [1]
660신동열6/11/200715345ClickOnce 업데이트시 이전 버젼 제거오류 [1]
659한귀순6/11/200716606윈폼 프로그램 및 디자인. [2]
661한귀순6/12/200714105    답변글 [추가질문]: 윈폼 프로그램 및 디자인. [3]
657정해봉6/8/200724877요청 시간 초과 오류 [2]
655이방은5/28/200715159성태님 UML 도구 뭐 쓰십니까??? [1]
654임정훈5/23/200714023카드스페이스 관련질문
658정성태6/9/200714717    답변글 [답변]: 카드스페이스 관련질문 [1]
653사다수스5/22/200735597아래한글(HwpCtrl) ocx 메모리 릭 문제입니다. [4]파일 다운로드1
645송원석5/15/200716908ASP 의 ByVal 과 ByRef 특성
646정성태5/15/200716637    답변글 [답변]: ASP 의 ByVal 과 ByRef 특성
647송원석5/16/200717021        답변글 [답변]: [답변]: ASP 의 ByVal 과 ByRef 특성 [1]
648정성태5/16/200715783            답변글 [답변]: [답변]: [답변]: ASP의 ByVal과 ByRef 특성 [1]
649장윤태5/16/200714822                답변글 [답변]: [답변]: [답변]: [답변]: ASP 의 ByVal 과 ByRef 특성
650정성태5/16/200713012                    답변글 [답변]: [답변]: [답변]: [답변]: [답변]: ASP의 ByVal과 ByRef 특성 [2]
643해운대끓...5/15/200712409Singleton 패턴 테스트중 하나의 윈폼만 열기 오류파일 다운로드1
... 61  62  63  64  65  66  67  68  69  70  71  72  73  74  [75]  ...