article search result of 'DragDrop' : 1

  1. 2011.01.25 [Shell32.DLL] *.LNK , *.URL 분석하기 (84)

[Shell32.DLL] *.LNK , *.URL 분석하기





/**************************LNK파일 모양******************************/
L        ?      F?       ?|邂栗S執네??|邂栗 t                    W P???i↖ +00? /E:\                   l 1     ?? PROGRA~1  T 絶?뢒??*   퉠                   P r o g r a m   F i l e s   ( x 8 6 )   X 1     ?? ARTHRO~1  @ 絶????*  
                   A r t h r o p o d   d 2  t ??  ARTHRO~1.EXE  H 絶????*   U
                  A r t h r o p o d . e x e      d            4       c         Kd끘   새 볼륨 E:\Program Files (x86)\Arthropod\Arthropod.exe  (      ?   1SPS?XF퍵8C샜?쁬?        `     쟚       uf15-pc                         V솝??? $?^                V솝??? $?^   
/********************************************************************/



/*********************URL 파일 모양 ***********************************/
[DEFAULT]
BASEURL=http://cafe.naver.com/gosusi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4109
[{000214A0-0000-0000-C000-000000000046}]
Prop3=19,2
[InternetShortcut]
URL=http://cafe.naver.com/gosusi.cafe?iframe_url=/ArticleRead.nhn%3Farticleid=4109
IDList=
IconFile=http://cafe.naver.com/favicon.ico
IconIndex=1
/**********************************************************************/


처럼 LNK는 바이너리 타입이고 URL은 텍스트타입이다.

코드를 보면,




Created with colorer-take5 library. Type 'csharp'

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
using System.IO;
using Shell32;
using System.Reflection;

namespace LnkASMB2
{
    public partial class MainWindow : Window
    {
        TRACE_Lib.TRACE.TRACE_DELE trace = TRACE_Lib.TRACE.getTrace;
        public MainWindow()
        {
            InitializeComponent();

            //[0]
            this.AllowDrop = true;
            this.Drop += new DragEventHandler(MainWindow_Drop);
        }

        void MainWindow_Drop(object sender, DragEventArgs e)
        {
            //[1]
            if (e.Data.GetDataPresent(DataFormats.FileDrop))
            {
                //[2]
                string[] files = e.Data.GetData(DataFormats.FileDrop, true) as string[];
                FileInfo info = new FileInfo(files[0]);
                
                //[3]
                if (info.Extension == ".lnk" || info.Extension == ".LNK")
                    AssembleLNK(files[0]);
                else if (info.Extension == ".url" || info.Extension == ".URL")
                    AssembleURL(files[0]);
                else
                    MessageBox.Show("모르는파일입니다.");
            }
        }

        //[4]
        void AssembleLNK(string _path)
        {
            //[5]
            Shell shl = new Shell();
            //[6]
            Folder dir = shl.NameSpace(System.IO.Path.GetDirectoryName(_path));
            //[7]
            FolderItem item = dir.Items().Item(System.IO.Path.GetFileName(_path));

            //[8]
            List<object> itemPis = new List<object>();
            itemPis.Add(new { str = "단축아이�� 바이너리" });
            itemPis.Add(new {item.Application});
            itemPis.Add(new {hash = item.GetHashCode()});
            itemPis.Add(new {item.IsBrowsable});
            itemPis.Add(new {item.IsFolder});
            itemPis.Add(new {item.IsLink});
            itemPis.Add(new {item.Path});
            itemPis.Add(new {item.Name});
            itemPis.Add(new {item.Parent});
            itemPis.Add(new {item.Size});
            itemPis.Add(new {item.Type});

            //[9]
            ShowText(itemPis);
        }

        //[10]
        void AssembleURL(string _path)
        {
            TextReader tr = new StreamReader(_path);
            String tempLine = null;
            String result = null;
            while ((tempLine = tr.ReadLine()) != null)
            {
                //[11]
                if (tempLine.IndexOf("URL=") > -1)
                {
                    result = tempLine.Substring(4);
                }
            }
            //[12]
            textBox1.Text = "";
            textBox1.Text = "인터넷바로가기" + Environment.NewLine + result;
        }

        void ShowText(List<object> itemPis)
        {
            textBox1.Text = "";
            foreach (var o in itemPis)
            {
                textBox1.Text += o.ToString() + Environment.NewLine;
            }
        }
    }
}

 
주석
[0] : 드래그 드롭 설정과 이벤트
[1] : 만약 드롭파일의 유효성검사
[2] : 드롭된 파일위치 검출 과 FileInfo 생성
[3] : 확장자 식별과 예외처리
[4] : LNK 분석 (바이너리)
[5] : System32 폴더에서 Shell32.dll 을 가져와 참조추가 하여 사용
[6] : 디렉토리 검출
[7] : FolderItem 검출
[8] : 속성들의 리스트화
[9] : 출력
[10] : URL 분석 (텍스트)
[11] : 해당 줄에 "URL=" 검출 <*>
[12] : 출력!


주석 [11]은 윈도우의 경우이고 , MacOS계열에서 넘어오는것은 그냥 ( http://www.abc.com )꼴이다.
Shell32.dll 을 이용하면 윈도가 생성한 대부분의 파일을 분석할수 있다.
하지만 COM 객체라서 그런지 기본코드레벨로 리플렉션을 할수 없어 해당 속서을 파악할수 없다( PropertyInfo[] )
[ 파일속성관련 포스트 :  http://www.scripter.co.kr/entry/any ]
Yamecoder 야매코더_
C# 2011.01.25 13:43
Powerd by Tistory, designed by criuce
rss