article search result of 'WPF' : 2

  1. 2011.02.01 [XNA , WPF] XNA 에서 코드레벨로 WPF 생성하기 (165)
  2. 2011.01.25 [Shell32.DLL] *.LNK , *.URL 분석하기 (84)

[XNA , WPF] XNA 에서 코드레벨로 WPF 생성하기




필요한 레퍼런스는
 
System.Windows.Presentaion
System.Xaml
PresentationCore
PresentationFramework

이고  필요한 using 은

using System.Threading;
using System.Windows;
using System.Windows.Controls;

되겠다.


Created with colorer-take5 library. Type 'csharp'
XNA , Game1.cs 중 일부

        Texture2D tex;
        protected override void LoadContent()
        {
            spriteBatch = new SpriteBatch(GraphicsDevice);
            tex = Content.Load<Texture2D>("logo2");
            this.Window.Title = "currentThread :" + Thread.CurrentThread.ManagedThreadId;
            
            //[0] 새로운 wpf 어플을 생성하기 위해 새로운 스레드 생성 , 스레트타입은 STA
            Thread t = new Thread(startThread);
            t.ApartmentState = ApartmentState.STA;
            t.Start();
        }
        void startThread()
        {
            //[1] Application 객체를 선언하고 생성
            Application app = new Application();
            //[2] StartUp 이벤트를 건다.
            app.Startup += new StartupEventHandler(app_Startup);
            //[3] 그리고 시작!
            app.Run();
        }

        void app_Startup(object sender, StartupEventArgs e)
        {
            //[4] 새로운 윈도우를 생성한다
            Window win = new Window();
            win.Width = 300;
            win.Height = 300;
            win.Title = "currentThread :" + Thread.CurrentThread.ManagedThreadId;
            //[5] 새로운 윈도우를 표시한다
            win.Show();

            Button bt = new Button();
            bt.Content = "XNA 에서 WPF 생성��기";
            win.Content = bt;
        }

역시나 윈도우폼과 마찮가지로 STA 타입의 스레드가 필요하다.
그러나 윈폼과 Application 의 사용법이 다른점에 주의! (그냥 Application.Run 하면 안된다.)

또한 닷넷4.0의 경우 System.Xaml 을 필히 참조 시켜줘야 겠다. 
Yamecoder 야매코더_
XNA 2011.02.01 16:03

[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