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]


비밀번호

댓글 작성자
 




... [91]  92  93  94  95  96 
NoWriterDateCnt.TitleFile(s)
155최성우4/18/20058054[질문(--),(__)]BHO로 자동 로그인 기능 구현.. 패스워드를 읽어오지를 못합니다.
156정성태4/19/20056993    답변글 [답변]: [질문(--),(__)]BHO로 자동 로그인 기능 구현.. 패스워드를 읽어오지를 못합니다.
161최성우4/21/20057836        답변글 [답변]: [답변]: [질문(--),(__)]BHO로 자동 로그인 기능 구현.. 패스워드를 읽어오지를 못합니다.
164정성태4/22/20056775            답변글 [답변]: [답변]: [답변]: [질문(--),(__)]BHO로 자동 로그인 기능 구현.. 패스워드를 읽어오지를 못합니다.
176최성우5/3/20057182                답변글 [답변]: [답변]: [답변]: [답변]: [질문(--),(__)]BHO로 자동 로그인 기능 구현.. 패스워드를 읽어오지를 못합니다.
146안연준4/14/20057959컴포넌트 안에 컴포넌트 삽입? 헐 ! -_-;;
147정성태4/14/20056826    답변글 [답변]: 컴포넌트 안에 컴포넌트 삽입? 헐 ! -_-;;
148안연준4/15/20057134        답변글 [답변]: [답변]: 컴포넌트 안에 컴포넌트 삽입? 헐 ! -_-;; [2]
142김용국4/13/20057022SmartClient 방식에서 이미지(바이너리)파일을 DataBased에 저장하기위한 방안에 대한 문의
143정성태4/14/20056625    답변글 [답변]: SmartClient 방식에서 이미지(바이너리)파일을 DataBased에 저장하기위한 방안에 대한 문의
141김종욱4/12/20057000웹하드 시스템을 ACTIVEX 로 짜고 있습니다
144정성태4/14/20056783    답변글 [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다
149김종욱4/15/20056472        답변글 [답변]: [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다 [1]
150정성태4/15/20056803            답변글 [답변]: [답변]: [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다 [1]
151김종욱4/16/20056959                답변글 [답변]: [답변]: [답변]: [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다
152정성태4/16/20056846                    답변글 [답변]: [답변]: [답변]: [답변]: [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다
153김종욱4/18/20058523                        답변글 [답변]: [답변]: [답변]: [답변]: [답변]: [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다
154정성태4/18/20057880                            답변글 [답변]: [답변]: [답변]: [답변]: [답변]: [답변]: [답변]: 웹하드 시스템을 ACTIVEX 로 짜고 있습니다 [3]
140안연준4/11/20056707Smart Client 에서 오프라인 글 중...의문점
145정성태4/14/20056478    답변글 [답변]: Smart Client 에서 오프라인 글 중...의문점 [1]
134김용국4/6/200511011c# .Net 에 대한 문의좀 ^^ [WinForm 에서 UserControl로 작성된 폼을 호출하려는데....]
135정성태4/6/20059113    답변글 [답변]: c# .Net 에 대한 문의좀 ^^ [WinForm 에서 UserControl로 작성된 폼을 호출하려는데....]
136김용국4/6/20057736        답변글 [답변]: [답변]: c# .Net 에 대한 문의좀 ^^ [WinForm 에서 UserControl로 작성된 폼을 호출하려는데....]
137정성태4/7/20056985            답변글 [답변]: [답변]: [답변]: c# .Net 에 대한 문의좀 ^^ [WinForm 에서 UserControl로 작성된 폼을 호출하려는데....]
138김용국4/7/20056004                답변글 [답변]: [답변]: [답변]: [답변]: c# .Net 에 대한 문의좀 ^^ [WinForm 에서 UserControl로 작성된 폼을 호출하려는데....]
139김용국4/11/20056415                    답변글 잘 해결 되었습니다... 감사합니다 [한줄답변]
... [91]  92  93  94  95  96