터미널서버(Terminal Server)의 포트를 변경하는 방법

기본적으로 터미널 서버와 Windows 2000 / Windows Server 2003 터미널 서비스는 클라이언트 연결에 TCP 포트 3389를 사용합니다.
이 값은 변경하지 않는 것이 좋지만, 이 포트를 변경해야 할 경우에는 다음 방법을 참고하시면 됩니다.


서버쪽 변경부분

1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp
2. "PortNumber" 하위 키를 찾아 값이 (3389)의 16진수 값인 00000D3D인지 확인합니다.
   10진수로 포트 번호를 수정하고 새 값을 저장합니다.

만약 터미널서버에서 특정연결을 만들었다면, 특정연결명의 포트번호도 변경하시면 됩니다.
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\TerminalServer\WinStations\연결"PortNumber" 하위 키를 찾아
값이 (3389)의 16진수 값인 00000D3D인지 확인합니다. 10진수로 포트 번호를 수정하고 새 값을 저장합니다.


클라이언트 변경부분

1. 원격데스크톱연결 프로그램에서 127.0.0.1:xxxx 와 같이 접속한다.
2. 커넥션파일을 이용할경우 노트패드에서 "Server Port=3389"를 "Server Port=xxxx"로 변경
3. 웹 ActiveX 클라이언트는
     1. 터미널서비스웹디렉토리\TsWeb 폴더의 Default.htm 파일을 찾습니다.
     2. 메모장이나 다른 텍스트 편집기에서 Default.htm을 엽니다.
     3. "MsRdpClient.AdvancedSettings2"로 시작하는 항목을 찾습니다.
     4. 이러한 항목 뒤에 아래의 행을 추가합니다.
         MsRdpClient.AdvancedSettings2.RDPPort = xxxx

2007/10/23 01:24 2007/10/23 01:24
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

Windows 2003 서버의 터미널서버 접속 하기


작성:
 불나방


윈도우 2003 서버는 설치될 때 기본으로 터미널 서비스를 어플리케이션 모드로 설치를 하는데 이렇게 되면 접속하는 장치당 최초 접속으로 부터 90일간의 사용기간을 주고 이 기간이 지나면 접속이 안되게 된다. 물론 돈을 주고 라이센스를 사야하는 경우가 발생하는 것이다. 라이센스 비용이 만만치 않으므로 서버 관리자만 서버를 리모트로 접속할 경우라면(대부분 이러한 경우일 것이다.) 터미널 서버 설치 모드를 관리자 모드로 바꾸어야 한다.


제어판>시스템>원격


에 들어가서 이 컴퓨터의 원격지원을 허용함을 체그하면 관리자 모드로 전환되고 2개의 관리자 세션은 라이센스 없이 영구히 사용할 수 있다. 접속할 사용자를 원격 사용자 그룹에 추가하는 것도 잊지 말자.


일단 접속이 안되는 상태로 되면 설정을 바꿀수가 없게 되는데 이럴때 IDC로 달려가지는 말고 서버에 접속한 적이 없는 다른 사람컴퓨터로 접속하면 일단 접속이 되므로 이를 이용하여 설정을 바꾸면 된다.

2007/10/23 01:20 2007/10/23 01:20
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

換わりはいくらでもある。


換わりはいくらでもある。

그 이면을 이해한다면 그다지 분하거나 슬픈 말 만은 아닐 것이다.
2007/10/21 22:17 2007/10/21 22:17
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF 어플리케이션 트레이 아이콘으로 실행하기

2007/10/16 22:34

서비 .NET & WPF ,

아래는 WPF로 작성된 윈도우즈 어플리케이션을 트레이 아이콘으로 실행 할 수 있는 코드.

public partial class Window1 : System.Windows.Window
{

    public Window1()
    {
        InitializeComponent();

        System.Windows.Forms.NotifyIcon ni = new System.Windows.Forms.NotifyIcon();
        ni.Icon = new System.Drawing.Icon("Main.ico");
        ni.Visible = true;
        ni.DoubleClick += 
            delegate(object sender, EventArgs args)
            {
                this.Show();
                this.WindowState = WindowState.Normal;
            };
    }

    protected override void OnStateChanged(EventArgs e)
    {
        if (WindowState == WindowState.Minimized)
            this.Hide();

        base.OnStateChanged(e);
    }
}


트레이 아이콘에서 제거 하고 싶으면 NotifyIcon 클래스의 Visible 프로퍼티를 조작한다.
ni.Visible = false;





2007/10/16 22:34 2007/10/16 22:34
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

이은미 :: 어떤 그리움

고향을 떠나 대학 생활을 막 시작하던 시절
동아리방에서 카세트 테잎으로 듣기 시작했던 이은미씨의 음반들.

그 중에 기억에 남는 '어떤 그리움'


2007/10/15 02:52 2007/10/15 02:52
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

가을 빛 속으로...

2007/10/14 22:33

서비 Photo , ,


지난 주말 억새가 한창인 하늘공원을 찾았습니다.
오전까지 꾸물거리던 하늘도 오후 들어 고운 햇살을 내비치며 멋진 날씨를 선사해 주더군요.
풍성한 가을 햇살을 받으며 뽈뽈거리며 돌아다니고 야간엔 불꽃축전까지 관람하는 꽤 스테미너를 요하는
여정이었지만 역시나 따듯했던 햇살의 느낌이나 불꽃의 아름다움을 생각하면 조금 지치는 건
당연한 게 아닐까 하는 생각마저 들 정도였습니다.


Pastel Ocean - Happy Birthday 2 Us




















minolta @7, minolta 50mm, 100mm macro, kodak 100UC


사용자 삽입 이미지
2007/10/14 22:33 2007/10/14 22:33
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다
  1. 가끔 들러보고 갑니다만...모르는게 없으신 분 같습니다.
    *미놀타 @7은 후회가 없었던 기종입니다..다시 잡아보고 싶군요.

  2. fairwinds 님 과찬이세요..
    @7 끝까지 사용하고 싶은 기종이긴 하지만..
    들어가는 필름값이 만만치 않아서 디지털 바디를 장만하고
    싶다는 유혹을 많이 받고 있습니다.

JavaScript Base64 Encode / Decode

// This code was written by Tyler Akins and has been placed in the
// public domain.  It would be nice if you left this header intact.
// Base64 code from Tyler Akins --
http://rumkin.com

var keyStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

function encode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   do {
      chr1 = input.charCodeAt(i++);
      chr2 = input.charCodeAt(i++);
      chr3 = input.charCodeAt(i++);

      enc1 = chr1 >> 2;
      enc2 = ((chr1 & 3) << 4) | (chr2 >> 4);
      enc3 = ((chr2 & 15) << 2) | (chr3 >> 6);
      enc4 = chr3 & 63;

      if (isNaN(chr2)) {
         enc3 = enc4 = 64;
      } else if (isNaN(chr3)) {
         enc4 = 64;
      }

      output = output + keyStr.charAt(enc1) + keyStr.charAt(enc2) +
         keyStr.charAt(enc3) + keyStr.charAt(enc4);
   } while (i < input.length);
  
   return output;
}

function decode64(input) {
   var output = "";
   var chr1, chr2, chr3;
   var enc1, enc2, enc3, enc4;
   var i = 0;

   // remove all characters that are not A-Z, a-z, 0-9, +, /, or =
   input = input.replace(/[^A-Za-z0-9\+\/\=]/g, "");

   do {
      enc1 = keyStr.indexOf(input.charAt(i++));
      enc2 = keyStr.indexOf(input.charAt(i++));
      enc3 = keyStr.indexOf(input.charAt(i++));
      enc4 = keyStr.indexOf(input.charAt(i++));

      chr1 = (enc1 << 2) | (enc2 >> 4);
      chr2 = ((enc2 & 15) << 4) | (enc3 >> 2);
      chr3 = ((enc3 & 3) << 6) | enc4;

      output = output + String.fromCharCode(chr1);

      if (enc3 != 64) {
         output = output + String.fromCharCode(chr2);
      }
      if (enc4 != 64) {
         output = output + String.fromCharCode(chr3);
      }
   } while (i < input.length);

   return output;
}
function encode64Han(str) {
  return encode64(escape(str))
}
function decode64Han(str) {
  return unescape(decode64(str))
}

2007/10/12 20:47 2007/10/12 20:47
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

JAVA Base64 Encoding / Decoding

2007/10/12 20:44

서비 JAVA ,

//Ok how about this pure Java API solution.
//Yours for free free free, no unintened theft.
//Completely portable per the Java promise.
//This code sets no preferences! The class just extends AbstractPreferences to get access to the put and get and over rides them.
//The super still calls the Base64 to do the encoding and decoding.
//This extension intercepts the encoded/decoded strings and makes them visible.
//TaDa Java API supports, has, allows, does base64 encoding, for the clever anyway.

package yourpackage;
public class YourPreferences extends java.util.prefs.AbstractPreferences {
//keep the key state
    private java.util.Hashtable encodedStore = new java.util.Hashtable();
   
    /** Creates a new instance of YourPreferences*/
    public YourPreferences(java.util.prefs.AbstractPreferences prefs, java.lang.String string) {
 super(prefs, string);
    }
//main acts as a driver i.e. used to test this class not required by this class
    public static void main(java.lang.String[] args ){
 java.util.prefs.AbstractPreferences myprefs = new yourpackage.YourPreferences(null, "");
 
 java.lang.String stringToEncode = "Aladdin:open sesame";
 java.lang.String key = "Aladdin:open sesame";
 java.lang.String key_ = "KEYisNOTtheSAMEasTHEstring";
 try{
     java.lang.String encoded = ((yourpackage.YourPreferences)myprefs).encodeBase64(stringToEncode);
     java.lang.System.out.println("ENCODED STRING TO: " + encoded);
     java.lang.String base64 = (java.lang.String)((yourpackage.YourPreferences)myprefs).encodedStore.get(key);
     java.lang.String decoded = ((yourpackage.YourPreferences)myprefs).decodeBase64("newkey",base64);
     java.lang.System.out.println("DECODED STRING TO: " + decoded);
    
     java.lang.String encoded_ = ((yourpackage.YourPreferences)myprefs).encodeBase64(key_,"ALONGSTRANGESTRINGTHATMAKESNOSENCEATALLBUTCANBEENCODEDANYWAYREGARDLESS");
     java.lang.System.out.println("ENCODED STRING TO: " + encoded_);
     java.lang.String base64_ = (java.lang.String)((yourpackage.YourPreferences)myprefs).encodedStore.get(key_);
     java.lang.String decoded_ = ((yourpackage.YourPreferences)myprefs).decodeBase64(key_,base64_);
     java.lang.System.out.println("DECODED STRING TO: " + decoded_);
     java.lang.System.out.println("\n");
     java.util.Enumeration enum = ((yourpackage.YourPreferences)myprefs).encodedStore.keys();
     java.lang.String enumKey = null;
     while(enum.hasMoreElements()){
  enumKey = (java.lang.String)enum.nextElement();
  java.lang.System.out.print(enumKey);
  java.lang.System.out.println(" : " +((yourpackage.YourPreferences)myprefs).encodedStore.get(enumKey).toString());
     }
 }catch(java.io.UnsupportedEncodingException uee){
     uee.printStackTrace();
 }catch(java.io.IOException ioe){
     ioe.printStackTrace();
 }
    }
    public java.lang.String encodeBase64(java.lang.String key, java.lang.String raw)throws java.io.UnsupportedEncodingException{
 java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
 java.io.PrintWriter pw = new java.io.PrintWriter(
     new java.io.OutputStreamWriter(baos,"UTF8"));
 pw.write(raw.toCharArray());
 pw.flush();//ya know
 byte[] rawUTF8 = baos.toByteArray();
 this.putByteArray(key, rawUTF8);
 
 return (java.lang.String)this.encodedStore.get(key);
    }
    public java.lang.String encodeBase64(java.lang.String raw)throws java.io.UnsupportedEncodingException{
 
 java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream();
 java.io.PrintWriter pw = new java.io.PrintWriter(
     new java.io.OutputStreamWriter(baos,"UTF8"));
 pw.write(raw.toCharArray());
 pw.flush();//ya know
 byte[] rawUTF8 = baos.toByteArray();
 this.putByteArray(raw, rawUTF8);
 
 return (java.lang.String)this.encodedStore.get(raw);
    }
    public java.lang.String decodeBase64(java.lang.String key, java.lang.String base64String)
    throws java.io.UnsupportedEncodingException, java.io.IOException{
 byte[] def = {(byte)'D',(byte)'E',(byte)'F'};//not used at any point
 this.encodedStore.put(key,base64String);
 char[] platformChars = null;
 byte[] byteResults = null;
 byteResults = this.getByteArray(key, def);
 java.io.InputStreamReader isr = new java.io.InputStreamReader(
     new java.io.ByteArrayInputStream(byteResults),"UTF8");
 platformChars = new char[byteResults.length];
 isr.read(platformChars);
 
 return new java.lang.String(platformChars);
    }
//intercept key lookup and return our own base64 encoded string to super
    public String get(String key, String def) {
 return (java.lang.String)this.encodedStore.get(key);
    }
//intercepts put captures the base64 encoded string and returns it
    public void put(String key, String value){
 this.encodedStore.put(key, value);//save the encoded string
    }
//dummy implementation as AbstractPreferences is extended to get acces to protected
//methods and to overide put(String,String) and get(String,String)
    protected java.util.prefs.AbstractPreferences childSpi(String name) {return null;}
    protected String[] childrenNamesSpi() throws java.util.prefs.BackingStoreException {return null;}
    protected void flushSpi() throws java.util.prefs.BackingStoreException {}
    protected String getSpi(String key) {return null;}
    protected String[] keysSpi() throws java.util.prefs.BackingStoreException {return null;}
    protected void putSpi(String key, String value) {}
    protected void removeNodeSpi() throws java.util.prefs.BackingStoreException {}
    protected void removeSpi(String key) {}
    protected void syncSpi() throws java.util.prefs.BackingStoreException {}
}

2007/10/12 20:44 2007/10/12 20:44
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

갤러리 2.2.3 보안문제 수정 릴리즈 Gallery 2.2.3 Security Fix Release

2007/10/07 11:01

서비 Photo

사용자 삽입 이미지
 지난 8월 29일 갤러리 2.2.3 이 릴리즈 되었습니다.
새로운 기능추가는 없지만 reupload 와 webdav 모듈에서의
심각한 보안문제를 해결 했다고 합니다.

업그래이드버전은 여기에서 다운로드할 수 있습니다.




아래는 2.2.3 릴리즈에대한 원문입니다.

Gallery 2.2.3 is now available for download. This release adds no new features. It fixes critical application security bugs in the WebDAV and Reupload modules. If the WebDAV or Reupload modules are active in your Gallery we strongly recommend that you either disable them, upgrade them via Downloadable Plugins or perform a complete upgrade to version 2.2.3. Thanks go to Merrick Manalastas and Nicklous Roberts for reporting the issues to the Gallery Security team!

Gallery 2.2.3 is a small security upgrade from 2.2.2 and has the same requirements as 2.2.2. If you haven't upgraded to 2.2.x yet, please refer to the release announcement of Gallery 2.2 for highlights of changes and the requirements of the Gallery 2.2 release.

Read on for more details and upgrade instructions...

Is your Gallery installation affected? You can check whether the WebDAV or Reupload module is active on the Site Admin » Plugins page of your Gallery. If these module are not active, you can safely skip Gallery 2.2.3.

Upgrading instructions:
  • Users of Gallery 2.2 or later versions can upgrade the WebDAV and Reupload modules via Downloadable Plugins from the official plugin repository. This is certainly the fastest and the easiest solution.
  • Upgrading is quick and easy, but if you're upgrading from 2.1 or earlier there are a few things you should know first so be sure to scan the upgrading instructions. Upgrading from Gallery 2.2, 2.2.1 or 2.2.2 is even easier since you don't need to replace all your gallery2/ files, but changed files in the specific modules only.
Security vulnerabilities - Gallery 2.2.3 addresses the following security vulnerabilities:
  • Unauthorized renaming of items possible with WebDAV (reported by Merrick Manalastas)
  • Unauthorized modification and retrieval of item properties possible with WebDAV
  • Unauthorized locking and replacing of items possible with WebDAV
  • Unauthorized editing of data file possible via linked items with Reupload and WebDAV (reported by Nicklous Roberts)

Bounties - As part of Gallery's Bounty Program, Merrick Manalastas will receive a bounty of $500 and Nicklous Roberts a bounty of $200 for reporting the security vulnerabilities to the Gallery Security team. Please remember that to receive the full bounty you should report security issues to security@gallery.menalto.com and not make them public at all (not even in the bug tracker) before we had a chance to fix the issue.

2007/10/07 11:01 2007/10/07 11:01
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF (Winsows Presentation Foundation) Class Hierarchy

2007/10/05 23:35

서비 .NET & WPF ,

WPF (Winsows Presentation Foundation) Class Hierarchy

WPF (Winsows Presentation Foundation) Class Hierarchy

Windows Presentation Foundation 의 Class 계층도
2007/10/05 23:35 2007/10/05 23:35
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

엑스테 (Exte: Hair Extensions, エクステ)

엑스테 Exte
소녀의 사체에서 머리카락이....「헤어 익스텐션」
요코하마 컨테이너에서 발견된 많은 양의 머릿카락. 그 안에는 소녀 유체가 묻혀 있었다.
죽었는데도 여전히 머리카락이 자라고 있는 여자에 놀란 사체안치소 관리인 야마자키(오오스기렌)은
그 머리카락으로 헤어익스텐션(가발)을 만들도록 미용실에 나눠줬다.
그리고 그 가발을 쓴 사람이 차례로 죽어가는데....

왜 소녀의 사체에서 그런 저주스런 일이 벌어지는지는 끝까지 밝혀지지 않는 인과관계가 명확하지 않은 공포물.
하지만 소녀의 사체뿐 만이나리 산 사람의 상처,안구,손톱사이에 이르기까지 털이 자라는 모양이 섬뜩해 도무지
맘이 안정되지 않는 영화.

피가 튀는건 싫지만 오싹해지는 공포를 원하는 사람에게는 안성맞춤이다. 소노시온감독 작품.

여주인공은 영화 킬빌에서 철퇴를 휘두르는 연기를 보여준 구리야마 치아키.
카미팬을 연기하는 오오스기렌은 튀는 연기로 째째한 이미지를 벗었다. 이번 작품에서 가장 무서운것은
오오스기의 집착일지도 모른다.


2007/10/05 16:15 2007/10/05 16:15
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

WPF (Winsows Presentation Foundation) LifeTime :: WPF 어플리케이션 생명주기

WPF (Winsows Presentation Foundation) LifeCycle

출처 : MSDN Library


MSDN에 있는 WPF의 라이프 사이클에 대한 그림이다.
가운데 Application Object 상자 안이 코어 부분인데, 하나의 Application은
Run 매서드로 시작해서 Shutdown 매서드의 호출로 끝나게 된다.
Shoutdown 매서드의 호출은 ShutdownMode의 값에 따라서 Application이 자동으로 호출해주는 경우와  
사용자가 반드시 호출해주는 경우로 구분된다. 그리고 Activated, Deactivated,
DispatcherUnhandledException, SessionEnding, Exit는 Application에 발생하는 이벤트이다.
SessionEnding의 경우는 사용자가 OS를 Shutdown하거나 Logoff 시에 호출되는데 이 이벤트 안에서
OS의 종료를 취소시킬 수 있다. 또한 DispatcherUnhandledException 이벤트는 Application에서
처리되지 않는 예외가 발생했을 경우에 발생하는 범용 예외 처리가 가능한 곳으로 지정하지
않았을 경우 예외가 발생하면 Application은 자동으로 종료된다. 
2007/10/01 12:01 2007/10/01 12:01
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

사쿠란 :: さくらん

사쿠란 さくらん
사쿠란 さくらん

"에너지 넘치는 화려한 유곽 영화!"

<사쿠란(さくらん)>은 에도(江戶) 시대의 유명한 유곽이었던 요시와라(吉原)에서 평생을 살아야 했던 여성들의 모습을 그린 안노 모요코(安野モヨコ :: 에반게리온 감독으로 유명한 안노히데아키의 부인이다.)의 원작 만화를 감독 니나가와 미카(蜷川実花), 주연 츠치야 안나(土屋アンナ)로 영화화한 작품. 남녀의 속사정과 사랑을 그리면서도 자신의 삶을 누구보다 멋지게 살아낸 키요바(きよ葉)를 가장 중점적으로 그리고 있으며 그런 주인공을 츠치야가 생생하게 묘사하고 있다.

이 작품이 영화 데뷔작이 되는 유명 연출가 니나가와 유키오(蜷川幸雄)의 맏딸이자 사진가인 니나가와 미카(蜷川実花) 감독이 그려낸 영상은 총천연색의 향연이라 할 정도로 화려하고, 아슬아슬한 정사 장면도 형형색색의 색채 속에서 아름답게 표현되고 있다. 각본은 <달과 체리(月とチェリ-)>의 다나다 유키(タナダユキ)가 담당했고 음악 감독을 시나 링고(椎名林檎)가 맡았다. 오이란(花魁, 에도 시대 유곽의 창녀) 영화로서는 보기 드문 강렬한 에너지의 청춘 영화가 탄생했다.

사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん
사쿠란 さくらん

사진작가 출신 감독 작품답게 영상의 아무장면이나 잡아 놓아도 스틸컷이 되어버리는
멋진 화면 구성을 보여주고 있으며, 음악또한 시나이링고의 명성에 걸맞게 빠지지 않는다.
강렬한 이미지의 가볍고 경쾌한 터치의 영화를 원한다면 놓칠 수 없는 작품 중 하나가 될 듯.
2007/09/29 02:14 2007/09/29 02:14
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

C# 레지스트리에 값을 쓰고, 읽고, 삭제하기

2007/09/28 19:31

서비 .NET & WPF ,

using System;
using System.Collections.Generic;
using System.Text;
using Microsoft.Win32;  // 레지스트리관련 클래스를 쓰기위해서 추가

namespace regiEx1
{
    class Program
    {
        static void Main(string[] args)
        {
            string regSubkey = "Software\\myTestKey";
            // 서브키를 얻어온다. 없으면 null
            RegistryKey rk = Registry.LocalMachine.OpenSubKey(regSubkey, true);
            // 없으면 서브키를 만든다.
            if (rk == null)                                                         
            {
                // 해당이름으로 서브키 생성
                rk = Registry.LocalMachine.CreateSubKey(regSubkey);                 
            }
            string[] strData = new string[] {"aaa","bbb","ccc"};
            // 서브키 아래 값 쓰기
            rk.SetValue("test", strData);
            // 서브키 아래 값 읽기
            string[] regStr = rk.GetValue("test") as string[];                     
           
            Console.WriteLine(regStr[1]);
            Console.ReadLine();

            // 서브키 삭제
            Registry.LocalMachine.DeleteSubKey(regSubkey);                         
        }
    }
}
2007/09/28 19:31 2007/09/28 19:31
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다

[STAThread] 어트리뷰트는 뭘 의미하는거지?

using System;
using System.Windows;
using System.Windows.Input;
using System.Windows.Media;

namespace Petzold.DisplaySomeText
{
    public class DisplaySomeText : Window
    {
        [STAThread]
        public static void Main()
        {
            Application app = new Application();
            app.Run(new DisplaySomeText());
        }
        public DisplaySomeText()
        {
            Title = "Display Some Text";
            Content = "Content can be simple text!";
        }
    }
}

와 같은 C# 코드에서 [STAThread] 가 의미하는 바는 :
기본적으로, VS .NET에 의해 만들어진 응용 프로그램의 Main()메소드에는 [STAThread] 어트리뷰트가 첨가되어 있다.
이 어트리뷰트는 해당 응용 프로그램이 COM형식을 이용하는 경우에 (단지 이 경우에만 해당하는 것인데) 해당 응용 프로그램이
단일 스레드 아파트(single threaded apartment, STA) 모델로 설정되어야 한다는 것을 런타임에게 알려주는 역할을 한다.
해당 응용 프로그램에서 COM 형식을 이용하지 않는다면, [STAThread] 어트리뷰트는 무시되기 때문에 삭제해도 무방하다.
2007/09/28 16:41 2007/09/28 16:41
Trackback Address:이 글에는 트랙백을 보낼 수 없습니다