-
08-05-2011, 04:04 PM #1Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Cách lấy Icon của file dựa trên phần mở rộng của file ấy?
Mình đang làm 1 FTP client , nhưng vướng vấn đề về hiển thị icon trong listview
FTP server khi được yêu cầu bằng lệnh List sẽ trả về danh sách các file hiện có trong 1 thư mục nào đấy. dựa vào danh sách file này mình muốn lấy ra Icon của chương trình mở file đó trên máy tính hiện tại, giống như cửa sổ Local trong hình vẽ.
Hiện tại giải pháp của mình đang là dùng hàm AssocQueryString để lấy về chương trình được association với file type trong registry, và sau đó dùng SHGetFileInfo để lấy về Icon tương ứng và đưa vào list
Nói dài dòng là thế, tóm tắt lại là: mình muốn cái icon bên Remote giống như bên Local cho đẹp [IMG]images/smilies/applause.gif[/IMG] Mọi người xem hình đi kèm sẽ hiểu.
Với đa số các file là ổn nhưng với các file như EXE, BAT thì lại không thành công do tham số trả về là %1. hiện tại mình chưa biết làm thế nào, nhờ anh chị em giúp cho [IMG]images/smilies/biggrin.png[/IMG]
Qua tìm hiểu thì các icon này đều nằm trong shell32.dll, nhưng chẳng nhẽ cứ so sánh xâu rồi tìm và hiển thị, thủ công quá.
Bên local sử dụng đường dẫn file và hàm SHGetFileInfo nên không vấn đề gì
Đây là bài tập lớn của mình, mình phải nộp trong 2 tuần nữa nên rất mong mọi người hồi âm sớm. Cám ơn mọi người.
Mã:i = strList.ReverseFind(_T('.'));if (i!= -1){ cbSize = sizeof(szExePath); hr = AssocQueryString(ASSOCF_INIT_DEFAULTTOSTAR, ASSOCSTR_EXECUTABLE, m_strLog, _T( "open" ), szExePath, &cbSize );//lấy file Exe để mở định dạng file if( hr == S_OK) { if( SHGetFileInfo(szExePath, NULL, &shFileInfo, sizeof(SHFILEINFO), SHGFI_SYSICONINDEX | SHGFI_SMALLICON)) //lấy icon file exe kia pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList, shFileInfo.iIcon); //thêm vào list với icon else pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList);// thêm vào list và không icon } else pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList);// thêm vào list và không icon}else pCurrDlg->m_RemoteCtrl.InsertItem(iRow, strList);// thêm vào list và không icon
View more random threads:
- Hook sự kiện Edit,Save File thì cần phải làm những gì ?
- Kiểu Dữ Liệu Tương đương giữa 2 ngôn ngữ VB và C++
- Giả lập thao tác Drag của chuột trên một cửa sổ khác
- chỉ dẫn phương pháp Hook APi bằng inline hook
- SetClipboardData Trả Lại ClipBoard sau khi thực hiện GetClipboardData
- Hook hàm CreateProcessInternalW như thế nào?
- Nhận biết chương trình dạng console vừa được mở lên
- InjectDLL Sử Dụng SetWindowHook Hook KeyBoard
- Get Url Active Firefox ?
- Hỏi về Kiến trúc HTML DOM ?
-
08-05-2011, 04:30 PM #2Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
cậu dùng hàm SHGetFileInfo với đường dẫn file PE để lấy Hincon của nó, rồi từ HICOn có thể display dễ dàng zồi
tớ cho cậu 1 ví dụ tớ đã viết hồi trước nè
Mã:int CLView::GetFileIconIndex(const TCHAR *FileName) { SHFILEINFO FI = {0}; SHGetFileInfo(FileName, FILE_ATTRIBUTE_NORMAL, &FI, sizeof(FI), SHGFI_SMALLICON | SHGFI_ICON ); int i = 0; if (FI.hIcon) i = this->m_ImgList.Add(FI.hIcon); DestroyIcon(FI.hIcon); return i; }
-
09-05-2011, 12:22 PM #3Junior Member
- Ngày tham gia
- Sep 2015
- Bài viết
- 0
Mình thấy cách này khá ổn
http://www.codeproject.com/KB/cs/Get...peAndIcon.aspx
-
09-05-2011, 03:24 PM #4Junior Member
- Ngày tham gia
- Sep 2015
- Đang ở
- hà nội
- Bài viết
- 0
Cám ơn 2 bạn đã trả lời, cách của bạn Alex và gianghoplus mình đã đọc rồi , cơ bản dùng cách của Alex là ổn
hôm nay mình làm được rồi, đơn giản thôi:
- dùng GetTempPath để lấy được đường dẫn thư mục tạm
- Tạo 1 file tạm có phần mở rộng tương ứng
- dùng SHGetFileInfo
- Xóa file tạm
Làm thế này tiện hơn, đơn giản thế này mà hôm qua mình ko nghĩ ra, lại đi lập thread [IMG]images/smilies/biggrin.png[/IMG]
Cám ơn mọi người đã quan tâm[IMG]images/smilies/clap_grin.gif[/IMG]
Pallet nhựa Lâm Đồng giải pháp hoàn hảo cho nhà kho Pallet nhựa Lâm Đồng là một giải pháp đa năng và hiệu quả trong việc vận chuyển và lưu trữ hàng hóa. Trong đó, pallet nhựa Lâm Đồng không chỉ đáp...
Pallet nhựa Lâm Đồng giải pháp...