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]


비밀번호

댓글 작성자
 




... 31  32  33  34  35  36  37  [38]  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
4938김성대1/3/201815707채팅 프로그램관련 질문입니다. [9]파일 다운로드1
4937Ques...1/3/201817867C# CPU 사용량 한계치 늘리는 방법 [2]
4936무개1/3/201815005책 내용 인용하는 것에 관한 질문이있습니다. [1]파일 다운로드1
4935몬난아12/28/201717804IIS 및 ASP.NET 이 서버에서의 동작방식? [2]
4934Ques...12/26/201729133C# 해상도에 따른 자동 사이즈 조절방법이 궁금합니다. [3]
4933Kay12/15/201715261C# VS 버전 에러 질문 드립니다. [1]파일 다운로드1
4932정환나라12/13/201715592vs2013에서 빌드한 com 컨트롤 객체를 닷넷 2.0에서 사용하려 합니다 [4]
4931Arvid12/12/201716278Visual Studio 2012 c# using문 참조 에러 [5]파일 다운로드1
4929김성대12/8/201714453app.config에 관한질문입니다. [1]
4928김성대12/7/201715377SQL Server 설치에러에 대한 질문입니다. [1]파일 다운로드1
4926heyh...12/6/201714447[삭제] ContextSwitchDeadlock????
4925ho12/5/201715002[삭제] WebBrowser로 드롭박스 로그인 페이지 탐색 시 발생한 문제에 대해 질문 올립니다.파일 다운로드2
4924몽중언12/3/201715448C# 디버깅 모드에서만 DB Insert가 되는 현상 질의 [6]
4923고요한11/23/201715613파일 확장자에 연결된 프로그램을 등록하는 방법에 대한 질문입니다. [2]
4922박성훈11/23/201717025시작하세요! C# 7.1 학습 방법 [3]
4921초보개발자11/20/201713801[삭제] 폼 사이즈 질문드립니다.
4920Ques...11/19/201714587IEnumerable 의 "지연된 평가" 에 관하여 질문드립니다. [2]파일 다운로드1
4919mskim11/16/201715276Split()을 이용하여 문자 구분 시 구분문자도 같이 저장하는 방법이 있나요? [2]
4917ho11/16/201715738WPF XAML 트리거 관련해 문의 드립니다. [3]
4918ho11/16/201716363    답변글 [답변]: 예제 프로젝트 첨부합니다. [4]파일 다운로드2
4916필승11/11/201715868기본 웹 브라우저 체크는 어떻게 해야 하나요? [2]
4915필승11/10/201715026WebBrowser 컨트롤 소리 출력 문의 드립니다. [2]
4914Ques...11/10/201715699c# 버튼 이벤트에 관하여 질문드립니다. [2]
4913Arvid11/8/201718537Log4Net 라이브러리를 이용하여 특정 기간이 지났을 때 자동 로그 삭제 기능 구현 질문 드립니다! [2]
4912조범희11/8/201718096C# FTP 다운로드중 에러 발생.. [2]파일 다운로드1
4911필승11/6/201716441WebBrowser 컨트롤 사용법에 대해 궁금합니다. [2]
... 31  32  33  34  35  36  37  [38]  39  40  41  42  43  44  45  ...