/// 헤더파일
// 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]