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]


비밀번호

댓글 작성자
 




1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5859guest3/21/202310388개발 일지 어떻게 관리하시나요? 이런 프로그램 없나요? [3]
5858김태원3/18/202310582안녕하세요! [5]
5857guest3/17/202310639귀도 반 로썸을 보고 [4]
5856guest3/17/202310739Form1_FormClosing에 closing time을 Sqlite 저장하는 법? [6]파일 다운로드1
5855욜로3/17/20239919C# 메타데이터에서 불러오는 참조 정의가 안됨 [1]
5854민성3/16/202310411안녕하세요 asp.net mvc using문 관련하여 [1]
5853pa3/16/202310359오피스 2016 업데이트 후 파일 출력 불가 [1]
5852guest3/16/202310026입력 foreach 검색/출력 foreach [3]
5851guest3/15/202310863foreach내 list변경 [10]
5850독서가3/14/20239880C#에서 동적dll 사용시 문의입니다. [4]파일 다운로드1
5849guest3/9/202310612C# wpf로 Web에서 구동되는 hts가능한가요? (노트북없고 스마트폰 없음) [4]
5848민성3/9/202310066도움 요청드립니다. [2]파일 다운로드1
5847guest3/7/202310491SQlike Like 구문 - 1시간째 인데 안되네요 [13]
5846Huuu...3/7/20239468웹 다운로드에 대한 고찰 [5]파일 다운로드1
5845guest3/7/20239553C# Split함수의 불친절함 [1]
5844까망이3/7/20239694c# 무료 디컴파일러는 어떤게 좋습니까? [1]
5843guest3/7/202310106판매 후 dll 등 에러 [5]
5842kr13/6/202310013publish 할 때 분석기 관련 dll 제외 [5]
5841guest3/3/202310120프로그램 판매 시 - Upgrade 버전 판매 [2]
5840joe3/2/202310451C# 클래스 라이브러리 수정 -> C++에서 참조시 함수 목록 갱신되지 않음. [4]파일 다운로드1
5839guest3/2/202310983윈도우 서비스 프로그램 - FORM 애플리케이션 감시서비스 [8]
5838랄랄라3/1/20239681event 사용 시 두 표현의 차이점이 있을까요? [1]
5837감사합니...2/28/202310166오라클 DB서버 접속관련 문의 드립니다.(Load Balancing, HA Events) [2]
5836박지범2/27/20239466static instance의 initialize 순서가 보장되나요? [6]
5835주민호2/25/202316120Windows Software Development Kit - 최신버전 1개 남기고 다 삭제하면 안되는지요? [10]파일 다운로드1
5834guest2/24/20239600Python IDE - 비주얼스튜디오 [3]
1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...