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]


비밀번호

댓글 작성자
 




... 16  17  [18]  19  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5515ocm6/14/202114378mips 어셈블리 연산 [6]파일 다운로드1
5514jongs6/11/202115186GethashCode와 String대한 질문 [2]
5513labe...6/11/202114622C# Winform 에서 Label에 동일한 Color를 넣었을 때 처리방법이 궁금합니다. [2]
55126/11/202115513xlwings 가 실행조차 되지 않습니다. ㅠㅠ [7]
5511Syong6/9/202113595User Control에 string array 속성 추가하는 방법 [4]
5510jay6/8/202112841string 문자열에 쌍따옴표(")를 넣고 싶습니다. [1]파일 다운로드1
5509한예지 donator6/3/202112736ExeccuteNonQuery 질문있습니다! [2]
5508최재남6/3/202113802마우스 이벤트 관련 질문 좀 드리겠습니다. [6]
5507한예6/2/202112613static과 스택오버플로우 질문있습니다. [5]파일 다운로드1
5506이창석6/1/202114215센서의 값을 받아서 PC를 통해 모니터링 하는 것을 만들고 있습니다. [1]
5505kss5/31/202112743.net5에서 소멸자가 어떻게 바뀐건가요? [1]
5503xing...5/24/202113006xingapinet 에 수정 요청 부탁 드립니다. [1]
5501한예지 donator5/23/202113342IProgress 사용법이 궁금합니다. [2]
5500한예ㅈ5/23/202115095비동기 코드 흐름 질문있습니다. [3]
5498곰장어5/21/202113123List에 static 변수를 추가했을때의 궁금증 [3]파일 다운로드1
5497지평선5/20/202114948윈도우 배율을 알 수 있을까요? [1]
5496cs린이5/20/202112351C# 8.0 질문입니다. [2]파일 다운로드6
5495Natie5/13/202111783객체를 생성과 동시에 초기화 하는 방법 [1]
5494지예예지5/13/202114334비동기 코드 흐름이 궁금합니다! [2]
5493xing...5/6/202111971xing api XQCSPAT00600 질문입니다 [4]파일 다운로드1
5492한예지 donator5/5/202112230FromCurrentSynchronizationContext 관련 코드 질문있습니다! [2]
5491조우성5/4/202117647WinForm과 WPF의 성능차이 비교한 자료가 있을까요? [4]
5490한예지 donator5/3/202113171UI 스레드의 Invoke 질문있습니다. [4]
5489저누4/28/202113896시작하세요 C# 9.0, 225페이지 구조체 관련 질문드립니다. [2]
5488종범4/27/202113903C# 비동기 함수 async, await 와 Task의 관계에 대해 질문 드립니다. [6]
5487진우4/27/202113368C# 엑셀 자동화 성능 향상 문의 [2]
... 16  17  [18]  19  20  21  22  23  24  25  26  27  28  29  30  ...