2009. 5. 8. 16:35

<div style="width:200; text-overflow:clip; overflow:hidden;">
    <nobr>제목이 긴 문자열로 이루어진 글을 테이블의 폭에 알맞게 잘라줍니다.</nobr>
</div>
<div style="width:200; text-overflow:ellipsis; overflow:hidden;">
    <nobr>제목이 긴 문자열로 이루어진 글을 테이블의 폭에 알맞게 잘라줍니다.</nobr>
</div>
<div style="width:200; text-overflow:ellipsis; overflow:visible;">
   <nobr>제목이 긴 문자열로 이루어진 글을 테이블의 폭에 알맞게 잘라줍니다.</nobr>
</div>
<table border=1>
  <tr style="padding-top:3">
    <td height=20 style="padding-left:5"><div style="overflow:hidden; text-overflow:ellipsis; width:220;"><nobr><a href="">제목이 긴 문자열로 이루어진 글을 테이블의 폭에 알맞게 잘라줍니다.</nobr></div></td>
    <td class=s>2006.12.26</td>
  </tr>
</table>

 

 

 

<style type="text/css">
.fixed table { table-layout : fixed; }
.fixed table tr td { text-overflow : ellipsis; overflow : hidden; }
</style>

<div class="fixed">
<table cellpadding="0px" cellspacing="0px" border="1px">
<tr>

<td width="2%">

<nobr>a234234234234234234234234234234qwreqwer</nobr></td>

<td width="3%">234234234</td>

<td width="95%">test</td></tr>
<tr>

<td>b</td>

<td>lekjalefjlaejiflaejflajeflajefljaaa</td>

<td>xxx</td></tr>
</table>
</div>

Posted by 굿데이
2009. 5. 8. 13:37

원문 : O'Reilly의 JavaScript and DHTML Cookbook



window.showModalDialog와 window.showModelessDialog 는 modal window가 보이는 동안
script 프로세싱을 중단시키고, modal window가 닫히면 계속 처리됩니다.



개인적인 생각으로는 Web의 통제권이 완전히 modal창으로 넘어가서 window.open 처럼
다른 화면이 아닌 단일창처럼 보여지는게 아닌가 생각됩니다. 결국 main창과
modal창은 다른 window지만 modal창이 main창의 프로세싱을 넘겨받아서 main창의
작업을 중단시켜 놓는것이 아닌가 생각됩니다.



사용법

   var dialogAnswer = window.showModalDialog(팝업.html, 모달명, 옵션);



modal창과 main창은 서로 다른 창이기 때문에 main창의 값을 읽기 위해서
window.dialogArguments property를 사용합니다.



modal창에서 main창으로 값을 넘기기 위해서는 window.returnValue property를
사용합니다.

[출처] window.showModal/Modeless에 대하여|작성자 헤르메스

/*
 ******************************************************************************************/

【 Show Modal Dialog 】

 - 일반적인 형태는 Window.open 과 동일한 형태를 가지지만, 팝업과는 달리 항상 부모창 위에 존재하며, 자식창

의 프로세스가 종료되지 않으면 부모창으로 되돌아 갈 수 없는 점이 window.open 과 다른 점이다.

 - 다시말해, 모달창은 오픈과 동시에 포커스를 자식창에서 잃지 않지만, 모달리스는 포커스를 부모창으로 이동

시킬 수 있다.

 - Show Modal은 ShowModal 과 ShoModaless로 분류되는데 ShowModaless는 일반 팝업창과 같다.

 * 사용법

 - Window.ShowModalDialog("URL",오브젝트 또는 윈도우,속성);
 - Window.ShowModalDialog("ex.asp",window,"dialogwidth:600px;...");

 - 속성부여방법
   Dialogwidth = '가로길이'
   Dialogheight = '세로길이'
   기타등등..

 - 사용처 : 기업용 홈페이지 또는 개인홈페이지의 ID조회등 정보 조회에 어울린다.

 * 예제 (부모창)

<html>

1  <script>
2  function openwin(){
 
3    var x= "dialogwidth:600px;dialogHeight:600px;status:no;help:no";
 
4    returnValue = window.showModalDialog("child.htm", window,x);
5    alert(returnValue)
6    }
7  </script>

8  <body>

9  <form name="Myform">
10 <input type="button" value="TEST" onclick="openwin();"><br><Br>
11    <input type="text" name="aaa" value="인천유나이티드">
12    <input type="text" name="bbb" value="수원삼성블루윙즈">
13    <input type="text" name="ccc" value="성남일화천마">
14    <input type="text" name="ddd" value="울산현대호랑이">
15    <input type="text" name="eee" value="FC서울">
16 </form>

12 </body>
13 </html>


------------------------ 설명 ---------------------------
2 : 모달창 함수 실행.
3 : 모달창을 띄울때 속성을 변수에 저장하여 사용.
4 : 모달창은 자식창에 데이터를 보낼 수도 있고, 또한 다시 받을 수도 있다.


  * 예제 (자식창)  child.htm

<html>

<script>
function init()
{
 var sData = dialogArguments;
 alert(sData.document.Myform.aaa.value);
 alert(sData.document.Myform.bbb.value);
 alert(sData.document.Myform.ccc.value);
 alert(sData.document.Myform.ddd.value);
 alert(sData.document.Myform.eee.value);
 window.close();
 window.returnValue="끝났지롱";
}
</script>

<body>
<form name="myform">
<input type="button" value="TEST" onclick="init()">
</form>
</body>
</html>

------------------------ 설명 ---------------------------

- 자식창에서 TEST 버튼을 클릭했을 시, 부모창에 있는 각각의 텍스트박스에
있는 내용을 Alert을 이용해서 볼 수 있다. 또한 모든 내용을 보고 난 후에는
다시 ReturnValue="끝났지롱"; 을 부모창에 보내준다.


- 모달은 오브젝트로 값을 저장하여, 부모창과 자식창에 넘겨주고, 받는 기능을 할 수 있다.

[출처] ShowModalDialog|작성자 의천도너
Posted by 굿데이
2009. 3. 12. 13:48
 Visual Studio 2005로 웹 서비스 개발을 할 때 가상 웹 서버를 사용하는 경우가 많습니다. 그런데 이 놈이 가끔 문제가 될 때가 있습니다. 바로 경로 문제!

프로젝트 단위로 개발 하는 개념 때문에 프로젝트 루트와 웹 서버 루트를 같이 사용해야 하는 경우에 개발 따로 테스트 따로 해야 하는 불편함을 없애기 위해 방법을 찾다 가상 웹 서버만 별도로 설정하면 된다는 결론에 도달 했습니다.
가상 웹 서버의 경로는 아래와 같습니다.

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.EXE
기본적으로 VS에서 실행하는 경우 아래와 같이 가상 디렉터리로 잡히기 때문에 경로설정에 문제가 될 경우도 있습니다.

Visual Studio 2005 가상웹서버 마음대로 설정하기

그럼 이 가상경로를 제거해보도록 하죠. 아래 그림은 가상 웹 서버의 사용법 도움말입니다.

Visual Studio 2005 가상웹서버 마음대로 설정하기

위 도움말을 참고해 우리 프로젝트를 실행을 시켜보도록 하겠습니다.

실행창에서

C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\WebDev.WebServer.EXE /port:8080 /path:"D:\Web"
요렇게 실행 하면 콘솔 창이 열리면서 아래와 같이 가상 웹 서버가 설정되는 것을 확인 할 수 있습니다.
Visual Studio 2005 가상웹서버 마음대로 설정하기

이제 VS 프로젝트 속성에서 아래와 같이 설정하면 해당 웹 서버에 디버깅 프로세스를 연결합니다.

Visual Studio 2005 가상웹서버 마음대로 설정하기

프로젝트 속성페이지를 열고, 시작옵션을 클릭합니다.
기본적으로 "기본 웹 서버 사용"이라고 되어있지만, 이 부분을 "사용자 지정서버사용"으로 옵션을 변경한 후 위에서 설정한 가상 웹 서버의 경로를 입력 해주면 끝 입니다.
그럼 이제부터 루트에서 시작되는 웹 프로젝트를 마음 것 개발 할 수 있습니다.




출처
http://wiz.pe.kr/142
Posted by 굿데이
2009. 1. 29. 16:54

private void SaveToFile(string UploadDir, ref System.Web.HttpFileCollection UploadFile)
  {
   string FileName, FileExt;
   int FileCnt;
   long FileSize;
   for (FileCnt = 0; FileCnt < UploadFile.Count; FileCnt++)
   {
    System.Web.HttpPostedFile CurFile = UploadFile.Get(FileCnt);
    FileName = System.IO.Path.GetFileName(CurFile.FileName);
    FileSize = CurFile.ContentLength / 1000;   // Kbyte 단위
    if(FileName != "")
    {
     FileExt = System.IO.Path.GetExtension(FileName);
     if (FileExt == ".aspx" || FileExt == ".asp")
     {
      myFunction.PrintMsgBack("확장자가 asp, aspx 파일은 업로드 하실수 없습니다.");
     }
     else
     {
      FileInfo saveFile;
      do
      {
       saveFile = new FileInfo(UploadDir + FileName);
       if(saveFile.Exists)
       {
        FileName = FileName.Replace(".","1.");
       }
      }
      while(saveFile.Exists);
      FileNames += FileName + (char)5;
      FileSizes += FileSize.ToString() + (char)5;
      CurFile.SaveAs(UploadDir + FileName);
     }
    }
   }
  }

출처 : Tong - centerkjh님의 Visual C#통

Posted by 굿데이
2008. 12. 30. 11:30

가상(virtual)메서드
 => 상속받는 클래스의 형변환을 위해 사용

추상클래스: 추상(abstract)메서드를 하나 이상 가지고 있는 클래스
 => 다중상속을 위해 사용

인터페이스(interface)
 => 다중상속을 위해 사용

추상클래스와 인터페이스의 차이점
 1) 추상클래스는 추상클래스를 상속받을수 있고, 일반클래스에 상속을 할 수 있지만,
     인터페이스는 오직 인터페이스 사이에서만 상속이 가능하다.
 2) 인터페이스는 접근권한자를 사용하지 않지만, 추상 클래스는 사용을 한다.
 3) 추상 클래스는 여러 형태의 구현을 포함할 수 있지만, 인터페이스는 할 수 없다.
 4) 인터페이스는 추상 메소드를 포함할 수 없다.


개념정리중...

Posted by 굿데이
2008. 12. 23. 00:32

스마트클라이언트 서명키 만들기

개인인증서 만드는 명령어 참고 주소:
ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.VisualStudio.v80.ko/dv_fxdeploy/html/a05b5f2f-d1f2-471a-8096-8b11f7554265.htm

스마트 클라이언트에서 클릭원스 매니페스트 서명 인증키가 제공되는데 이것은 기본적으로
테스트 인증서 입니다.

이 인증서는 생성 후 1년 밖에 사용하지 못합니다.

즉 1년 이후로는 만기가 되기 때문에 새로운 버전이 배포 되어도 업데이트가 이루어지지 않고
오류가 발생하여 아예 실행이 되지 않습니다.

더군다나 이렇게 생성된 테스트 인증서는 만기날짜 조정이 불가능 합니다.

그렇기 때문에 날짜가 조정가능한 한 인증서를 만들기 위해서는 cmd 창에서 아래 코드를 실행하면
개인인증서가 만들어 집니다.

makecert -r -pe -n "CN=HEC" -b 01/11/2006 -e 10/12/2100 -sky exchange -ss my


출처
http://www.setisigns.net/94

Posted by 굿데이
2008. 12. 22. 17:55
현재.. 대부분의 글들이 스마트클라이언트에 대한 것 들입니다.

ActiveX로 된 업/다운로드 컴포넌트들에 대한 약간은 답답함(?)에서 비롯된

자체개발욕구 때문에 닷넷으로 개발가능한 기술들에 대한 정보를 모으는 중입니다.

물론 웹하드에 사용할 컴포넌트 이므로 나스와도 무관하진 않군요.

만들수 있을지.. 언제 만들지는 모르지만.. 그냥 지금은 이렇게 의욕에 넘처 자료구하고,

테스트 해보는 중입니다.

언제쯤 개발 가능 하려나.. 이놈에 허접 ㅠㅠ
Posted by 굿데이
2008. 12. 22. 11:29

IE임베디드 스마트클라이언트를 테스트겸 작성해보면서 겪었던 문제점과 해결방법을
간단하게 정리해보겠습니다.

혹시나, 저와 같은 문제를 겪으실지도 모르는 분들을 위해.. 팁으로 알아두셨으면 합니다.

몇개 안되지만.. 도움이 되었으면 합니다. ^^



1. 스마트클라이언트에서 소켓 라이브러리 사용시 지연문제

2. DLL 추가 검색 문제

3. DLL 중복 다운로드 문제

4. 기타문제



저로 하여금 난감스럽게 만들었던 문제들입니다. 혹시나 해당되시는 분들이 있으시다면..
도움이 되길 바랍니다.

참고로 원리와 이유는 배제하고 해결법만 기재하겠습니다. 원리와 이유에 대해 자세히 알고자
하시는 분은.. 아래 사이트를 참고하시기 바랍니다.


"유경상"님과 "정성태"님의 글이 잘 정리되어있습니다.


http://taeyo.net/ (ASP.NET(외부)란에 정성태님의 스마트클라이언트 관련 게시물)

http://www.simpleisbest.net/archive/2006/01/02/360.aspx (유경상님의 닷넷블로그입니다.(추천))


그외, 데브피아 (강좌&팁 / 질답게시판)





1. 스마트클라이언트에서 소켓 라이브러리 API사용시 지연문제의 해결 ---------------------------


   http://www.devpia.com/forum/BoardView.aspx?forumname=csharp_lec&page=1&no=1059&code=

   링크로 직접보시는게 가장 적절한듯 싶어 링크를 걸어 놓습니다.


   주 내용은, IE임베디드 형태의 스마트클라이언트에서 소켓 라이브러리 API를 사용하기 전에

   System.Configuration.ConfigurationSettings.GetConfig("system.net/settings");
   구문을 먼저 삽입하라 입니다.


   본 내용은 강좌는 아니고 팁이므로 원리에 대해서는 설명하지 않겠습니다.


   * 일부 PC에서는 해당 구문의 삽입여부와 무관하게 정상적으로 동작하는것을 확인했습니다만
   역시나 넣어주는것이 안전합니다.




2. DLL추가 검색문제-----------------------------------------------------------
   스마트클라이언트 배포시 Fiddler를 통해 모니터링 하시다 보시면.



위와 같이 이미 DLL를 검색하고 다운로드 했음에도 불구하고 여기저기 다른곳을 검색하며,
파일을 찾을수 없다는 404에러를 뿌립니다. 이 문제의 해결책은 다음과 같습니다.

  일단 스마트클라이언트의 Config파일을 작성해야 합니다. 파일명은 "XXXX.dll.config" 입니다.  
 *.dll.config가 되야하므로 이점 주의하시기
바랍니다. config파일의 내용은 없어도 무방합니다.

  config파일은 배포할 스마트클라이언트 dll파일과 같은 곳에 위치해야합니다.


  웹파일에 다음구문을 추가합니다.  
  <link rel = "Configuration" href = "SmartClient_DLL/SmartClient.dll.config">


  * 참조경로 주의.


  역시나 이유와 원리에 대해서는 설명하지 않도록 하겠습니다. "정성태"님의 글에서는 문제점만 나타내었고.
  해결책이 제시되어있지 않지만 "유경상"님의 블로그에는 위와 같이 하는 이유에 대해
  자세히 설명되어있습니다. 해당 블로그를 참고 하시기 바랍니다.


  위와 같이 처리했다면, 배포시 여러군데서 중복검색하는 부하를 줄일 수 있습니다.

  해결된 모습입니다.


 


   


   

3. DLL 중복 다운로드 문제 ---------------------------------------------------------


   2번의 문제 해결을 읽어보시다가 발견하셨으리라 생각합니다.

   그림을 보시면   dll과 DLL 이렇게 확장자의 대소문자를 바꿔서 두번 다운로드 된것을 보실수 있을겁니다.


   이 문제에 대한 이유는 아쉽게도 찾을 수 없었습니다.

   

   허나, 데브피아 질답게시판에서 "유경상"님이 답변해주신 게시물을 발견했습니다.
   그곳에 해결책이 기재되어있더군요.


   해결책은 웹소스파일에서


   <OBJECT id="SC" style="WIDTH: 740px; HEIGHT: 544px"
   classid="SmartClient_DLL/SmartClient.dll#SmartClient.OTIS_WebViewer"  VIEWASTEXT VIEWASTEXT>
   </OBJECT>


   dll로 소문자기재를 하지말고, DLL로 대문자를 사용하라는 것이었습니다. (이유는 아쉽게도 모릅니다.)


   <OBJECT id="SC" style="WIDTH: 740px; HEIGHT: 544px"
   classid="SmartClient_DLL/SmartClient.DLL#SmartClient.OTIS_WebViewer"  VIEWASTEXT VIEWASTEXT>
   </OBJECT>



    중복다운로드를 해결한 모습입니다.


   




4. 기타 문제들...----------------------------------------------------------------------


   1) 컨트롤이 웹상에서 보이지만 동작하지 않을때


      >>  권한집합을 FullTrust로 준다음 제대로 동작하는지 재확인한다. 정상적이라면 소스코드중 권한을
   넘어서는 것이 없는지 확인하고
 권한의 범위를 재설정해본다.





   2) FullTrust권한을 주었음에도 불구하고, 컨트롤에 웹에서 보이기만 할뿐 동작하지 않을때.


       >> 프레임워크 1.1이 맞는지 확인한다. 상위버젼이 설치되어 있지 않은지 확인하고 만약 그렇다면


       C:\Program Files\Internet Explorer 폴더에 iexplore.exe.config 파일을 새로 생성하고,


       <?xml version="1.0" encoding="utf-8" ?>

          <configuration>

                <startup>

                      <requiredRuntime version="v1.1.4322"/>

                </startup>

           </configuration>


        이와 같이 익스플로러 실행시 사용할 프레임워크의 버젼을 지정해준다.





    3) 변경된 내용이 즉각 적용되지 않을때.


       >> 내용을 수정했다면, AssemblyInfo.cs파일의 어셈블리 버젼을 바꿔보자.


       >> 새로고침을 하지 말고 익스플로러를 완전히 종료하고 새로 열어보자.










-------------------------------------------------------------------------------


이 외에도 여러가지 문제점이 있었지만.. 막상 쓸려니 기억이 나질 안네요...(에휴 바본가봐.ㅜ.ㅜ)

다시한번 말씀드리지만. 이글은 강좌는 아니므로.. 중요한 원리와 이유에 대한 언급을 하지않았습니다.

훨씬 좋게 정리된 글들이 있으므로 그것을 참고하시기를 바라는 바입니다.



다만 직접 해보면서 겪었던 문제들에 대한 해결책들이 여기저기 흩어져 있었기에..
그것을 모아놓은 글이라 생각해주세요.


그럼 이만 끝냅니다. ^^


출처

http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=18&MAEULNo=8&no=1163&ref=1163
Posted by 굿데이
2008. 12. 22. 10:25

Smart Client (PrintPreviewDialog와 OpenFileDialog의 사용)

스마트 클라이언트란 말 그대로 똑똑한 클라이언트라 할 수 있다.
기존의 ActiveX컨트롤과 비슷한 기능을 하지만 그보다 훨씬 간단히 접근 할 수 있다. 물론 그렇게 만만한 놈은 아니다.
지금부터 스마트 클라이언트를 이용하여 웹브라우저에서 인쇄 및 파일 업로드 기능을 작성해 보도록 하자.

기존의 <input type=file>태그를 통하여 파일업로드를 할 경우 기본 컨트롤의 모양을 보기 좋게 바꾸기는 상당히 어려운 점이 많이 있었다.

하지만 스마트 클라이언트를 이용하면 간단히 이미지를 클릭할때 OpenFileDialog를 띄울 수 있다.

그럼 예제를 시작해 보도록 하자!!


using System;
using System.Drawing;
using System.Drawing.Printing;
using System.Runtime.InteropServices;
using System.Windows.Forms;

namespace RichWinForm
{
 //외부 스크립트의 호출을 위한 인터페이스
 public interface IPrintControlCOMIncomming
 {
  void show(string oData);
  string showDialog();
 }

 //외부 스크립트에서 public메서드를 호출하기위한
 [ClassInterface(ClassInterfaceType.None)]

//유저컨트롤과 인터페이스(외부의 스크립트에서 public메서드 호출을 위해)를 상속받는다.
 public class Print: System.Windows.Forms.UserControl, IPrintControlCOMIncomming
 {
  private System.Windows.Forms.Button btnFile;
  System.Windows.Forms.TextBox textBox1;
  System.Windows.Forms.Button button1;

  //미리보기 다이얼로그 인스턴스 생성
  PrintPreviewDialog ppd = new System.Windows.Forms.PrintPreviewDialog();

  //파일선택 다이얼로그
  OpenFileDialog ofd = new OpenFileDialog();

  //미리보기의 문서 인스턴스 생성
  PrintDocument pd = new PrintDocument();
 
  //초기화
  private void InitializeComponent()
  {
   this.button1 = new System.Windows.Forms.Button();
   this.textBox1 = new System.Windows.Forms.TextBox();
   this.btnFile = new System.Windows.Forms.Button();
   this.SuspendLayout();
   //
   // button1
   //
   this.button1.BackColor = System.Drawing.SystemColors.Control;
   this.button1.Font = new System.Drawing.Font("돋움", 12F,  System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
   this.button1.Location = new System.Drawing.Point(16, 16);
   this.button1.Name = "button1";
   this.button1.Size = new System.Drawing.Size(104, 23);
   this.button1.TabIndex = 0;
   this.button1.Text = "인쇄하기(윈폼)";
   this.button1.Click += new System.EventHandler(this.button1_Click);
   //
   // textBox1
   //
   this.textBox1.Location = new System.Drawing.Point(16, 56);
   this.textBox1.Name = "textBox1";
   this.textBox1.Size = new System.Drawing.Size(216, 21);
   this.textBox1.TabIndex = 1;
   this.textBox1.Text = "";
   //
   // btnFile
   //
   this.btnFile.BackColor = System.Drawing.SystemColors.Control;
   this.btnFile.Font = new System.Drawing.Font("돋움", 12F,
System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Pixel);
   this.btnFile.Location = new System.Drawing.Point(112, 104);
   this.btnFile.Name = "btnFile";
   this.btnFile.Size = new System.Drawing.Size(120, 23);
   this.btnFile.TabIndex = 3;
   this.btnFile.Text = "파일 업로드(윈폼)";
   this.btnFile.Click += new System.EventHandler(this.btnFile_Click);
   //
   // Print
   //
   this.BackColor = System.Drawing.SystemColors.ControlLight;
   this.Controls.Add(this.btnFile);
   this.Controls.Add(this.textBox1);
   this.Controls.Add(this.button1);
   this.Name = "Print";
   this.Size = new System.Drawing.Size(248, 176);
   this.ResumeLayout(false);

  }
 
  //생성자
  public Print()
  {
   InitializeComponent();
   this.pd.PrintPage += new PrintPageEventHandler(this.OnPrintPage);
  }
 
  //페이지를 설정하는 이벤트 메서드
  private void OnPrintPage(object obj, PrintPageEventArgs e)
  {
   string text = "앗싸!!! 된다...";
   System.Drawing.Font printFont = new System.Drawing.Font("돋움", 12, System.Drawing.FontStyle.Regular);

   e.Graphics.DrawString(text, printFont, System.Drawing.Brushes.Black, 0, 0);
  }
 
  //윈폼 버튼 클릭시
  private void button1_Click(object sender, System.EventArgs e)
  {
   //문서의 이름 설정
   pd.DocumentName="tt";
   //미리보기 다이얼로그에 문서 지정
   ppd.Document = pd;
   //다이얼로그 출력
   ppd.ShowDialog();
  }

  #region IPrintControlCOMIncomming 멤버

  //외부 스크립트 이벤트에 의하여 호줄 되는 메서드
  public void show(string oData)
  {
   //외부에서 데이터를 가져와서
   //버튼의 이름으로 설정
   textBox1.Text = oData;
   //문서의 이름 설정
   pd.DocumentName="tt";
   //미리보기 다이얼로그에 문서 지정
   ppd.Document = pd;
   //다이얼로그 출력
   ppd.ShowDialog();
  }

  //웹폼 버튼 선택 시 파일 경로 출력
  public string showDialog()
  {
   if(ofd.ShowDialog() == DialogResult.OK)
   {
    return ofd.FileName;
   }
   return null;
  }
  #endregion
 

  //윈폼 버튼 선택 시 파일 경로 출력
  private void btnFile_Click(object sender, System.EventArgs e)
  {
   if(ofd.ShowDialog() == DialogResult.OK)
   {
    textBox1.Text = ofd.FileName;
   }
  }
 }
}


dll을 호출하는 HTML 코드

기존의 ActiveX와 동일하게 <OBJECT>태그를 통하여 dll을 사용한다.

<%@ Page language="c#" Codebehind="MyForm.aspx.cs" AutoEventWireup="false" Inherits="RichWinForm.WebForm1" %>
<HTML>
 <HEAD>
  <title>WebForm1</title>
  <meta content="Microsoft Visual Studio .NET 7.1" name="GENERATOR">
  <meta content="C#" name="CODE_LANGUAGE">
  <meta content="JavaScript" name="vs_defaultClientScript">
  <meta content="
http://schemas.microsoft.com/intellisense/ie5" name="vs_targetSchema">
  <script language="javascript">
  function printClick()
  {
   MyForm.PrintPrev.show("외부에서 들어온 데이터 입니다.");
  }
  function openFile()
  {
   Output.innerText = MyForm.PrintPrev.showDialog();
  }
  </script>
  <script for="Slider" event="Scroll (source,args)" language="javascript">
   Output.innerText = MyForm.Slider.Value;
  </script>
 </HEAD>
 <body>
  <form id="MyForm" method="post" runat="server">
   <OBJECT id="PrintPrev" height="200" width="300" classid="http:Print.dll#RichWinForm.Print" VIEWASTEXT>
   </OBJECT>
   <br>
   <br>
   웹 버튼으로 인쇄해보자 :
   <input type="button" value="미리보기" onclick="printClick()">
   <br>
   <br>
   웹 버튼으로 파일업로드 :
   <input type="button" value="파일찾기" onclick="openFile()">
   <asp:Button id="btnSave" runat="server" Text="저장"></asp:Button>
  </form>
  <span id="Output" runat="server">0</span>
 
 </body>
</HTML
>

Posted by 굿데이
2008. 12. 22. 10:00

Smart Client


  Smart Client는 자동 Update 기능을 손쉽게 구현할 수 있는 기능이다.  자동 Update 기능은 개념은 다르지만 이미 V3, 아래아 한글 등 많은 프로그램에서 기능을 구현해 놓았다.

 Smart Client 기능은 타 응용 프로그램에서는 새버젼의 파일이 있을 경우 사용자에게 Update 할것인지를 선택하게 하나, Smart Client는 실행시 자동으로 Update된다.

  이 기능을 응용하면 웹 브라우저에서 실행되는 것 처럼 구성할 수도 있다.

   웹 브라우저에 포함되어 실행되는 프로그램은 기존에 ActiveX나 JAVA로 프로그램하여 구성하였다. 그러나 이 경우 사이트 방문자가 모르는 사이 프로그램이 설치되어 많은 문제를 야기 시켰다. 이를 해결하기 위해 Windows XP SP2이상에서는 보안 경고를 내보내고 있긴하나 완전한 해결책은 아니다.

  따라서 C#에서는 웹 브라우저에 포함되어 실행되는 형태는 지원하지 않는다. 따로 응용 어플리케이션을 다운 받아 실행할 수 있는 Smart Client 프로그램을 제작하여 배포함에 의해 웹 브라우저와는 별도의 화면으로 실행하도록 한다.

  이것은 필자가 C#을 접하면서 기대한 것과는 사뭇다르다. 필자는 ActiveX 같은 프로그램을 훨씬더 손쉬운 방법으로 제작할 수 있으리라 기대를 했었다. 그러나 Smart Client를 이용하면 ActiveX로 구성한 것과 비슷한 효과를 줄 수는 있다.

   응용 어플리케이션을 일반적으로 작성하여 IIS에 등록을 하고, 이 응용 어플리케이션을 자동으로 Update 할 수 있는 Smart Client 프로그램을 작성하고 배포하여 실행 하면 IIS 서버에 등록된 응용 어플리케이션을 다운 받아 실행하는 방식을 사용한다.

  이제 실제 Smart Client 프로그램을 제작해 보자. 여기서 사용할 응용 어플리케이션은  DLL과 Web Service에서 설명한 계산기를 이용할 것이다.

   기본 프로그램 제작에서 설명한 방식으로 프로젝트를 수동으로 하나 만든다. 프로젝트 이름은 CalcSmartClient로 한다. 참조에 System.dll과 System.Windows.Form.dll을 추가하고 CalcSmartClient.cs를 만든후 다음과 같이 코딩을 한다.

using System;

using System.Windows.Forms;

using System.Reflection;


class ShapeSmartClient

{

    public static void Main()

    {   

        try

        {

            Assembly assembly = Assembly.LoadFrom(

                "http://localhost/Calculator.exe");


            Type type = assembly.GetType("Calculator.MainForm");

            type.InvokeMember("Main",

                BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod,

                null, null, null);

        }

        catch(Exception ex)

        {

            MessageBox.Show("서버 에러입니다. 네트워크를 확인 한 후 실행하세요");

        }

    }

}


이제 응용 어플리케이션을 약간 수정하여 IIS에 등록해보자. 어플리케이션 수정은 간단하다. 기본 프로그램 제작에서 잠시 언급했었는데 Main 함수 앞에 public으로 선언하는 것이다.

또한 IIS에 등록하는 것도 간단하다. http://localhost에 해당하는 디렉토리(설정을 변경하지 않았으면 c:\inetpub\wwwroot가 그 위치이다)에 실행파일(dll을 사용하면 dll 파일도 같이)을 복사하기만 하면 된다.

1. 실행파일의 위치를 설정한다.

            Assembly assembly = Assembly.LoadFrom(

                "http://localhost/Calculator.exe");

2. Main을 포함한 클래스 이름을 설정한다. 클래스 이름은 namespace.class의 형태로 입력한다.

            Type type = assembly.GetType("Calculator.MainForm");

3. Main을 호출한다.

            type.InvokeMember("Main",

                BindingFlags.Public | BindingFlags.Static | BindingFlags.InvokeMethod,

                null, null, null);


이것이 Smart Client 제작의 전 과정이다.


   이제 제작한 SmartClientClient를 실행 해보자.

   Calculator가 잘 실행 될 것이다.

   탐색기를 실행하여 C:\WINDOWS\assembly로 가면 왼쪽 Tree에 Download가 있을 것이다. 좀 특수한 구조로 되어 있어 실제 오른쪽 파일 보이는 곳에는 존재하지 않은 디렉토리이다. Download를 선택하면 다음과 같이 나타난다.

 Calculator가 여러게 있는 것을 볼 수 있다. 실제 CalcSmartClient.exe를 실행하면 이곳에 Calculator.exe를 찾아 존재하지 않거나, 파일의 크기, 날짜, Version을 비교하여 다르면 서버로부터 다운 받아 실행한다. 참고로 실행 파일에서 사용하는 dll 파일을 그 루틴이 load 될 때(처음 사용될 때, 계산기 프로그램에서는 처음으로 = 키를 누를때) 자동으로 복사된다.

  여기서 우리는 Calculator 제작시 버전에 대해 전혀 신경쓰지 않았다. Calculator 프로젝트를 열어 Assembly.cs를 열어 보자.

  [assembly: AssemblyVersion("1.0.*")]라는 부분을 볼 수 있을 것이다. 마지막에 *는 자동으로 버전이 입력되도록 한 것이다. 이렇게 설정하면(초기 설정) 1.0.으로 시작하면서 나머지는 자동으로 입력이될 것이다. 자동으로 입력이 되는 부분이 Soruce를 수정하여 빌드를 할 때 마다 바뀌어 버전이 부여된다. 참고로 이 부분을 포함하여 전체 버전을 수동으로 입력하여도 된다. SmartClient를 이용하여 배포하는 경우에는 필요없는 다운로드를 피하기 위해 수동으로 관리하는 것이 좋다.


   이제 인터넷에서 실행되는 프로그램 처럼 보이게 해보자. Smart Client 프로그램 입력에서 http://localhost/Calculator.exe라고 입력 했던 부분 중 localhost 대신 실제 IP를 입력하여 빌드 하고 생성된 실행파일인 CalcSmartClient.exe를 http://localhost/의 위치로 복사한다.

   HTML 파일(여기서는 test.htm)을 하나 만들어 다음과 같이 입력한다.

<html>

<body>

<a href="CalcSmartClient.exe">실행</a>

</body>

</html>

  같은 PC에서건 외부 PC에서건 test.htm 파일을 인터넷 익스플로어에서 열면 다음과 같이 화면에 나타난다.

   

  여기에 DLL과 Web Service에서 설명한 보안 설정 법과 앞으로 설명할 보안 설정법을 표시하는 것이 좋다. 이것은 단순 HTML 작성법으로 작성해서 실행 주변에 Link 걸어 주면 되므로 설명하지 않는다.

  실행을 선택하면 다음과 같은 대화 상자가 생성된다.

  실행을 선택하면 다음과 같이 보안 경고 대화 상자가 생성된다.

   실행 버튼을 누르면 실행이 된다.

   실제 인터넷에서 실행되는 프로그램처럼 보이고자 한다면 위 두 버튼을 안나오게 하면 될 것이다. 이것은 웹서버를 신뢰할 수 있는 사이트로 등록함에 의해 이루어 진다.

  인터넷 익스플로어를 실행하여 도구 메뉴의 부메뉴 인터넷 옵션을 선택하여 생성된 대화 상자에서 보안 탭을 누르면 다음과 같이 화면에 나타난다.

  사이트를 선택하면 다음과 같은 대화 상자가 생성된다.

   영역에 웹 사이트 추가에 http://서버 IP의 형태로 입력하고, 이 영역에 있는 모든 사이트에 대해 서버 확인(https:) 필요 체크 버튼을 해제하고 추가를 선택한 후 확인을 누르면 신뢰할 수 있는 사이트로 등록이 된다.

  이것은 ActiveX와는 완전히 다르다. ActiveX는 인터넷 익스플로어에 포함되어 실행되나 이 프로그램은 인터넷에서 실행되는 것 처럼 보이지만 인터넷 익스플로어와는 전혀 별개로 동작한다. 앞에서도 이야기 했지만 Microsoft 사에서는 보안 문제 때문에 ActiveX 와 같은 형태의 프로그램을 버릴려고 하고 있다. ActiveX와 비교해 단점은 일부는 일반 HTML 화면과 응용 어플리케이션 화면을 같이 보여 줄수 없고 별도의 화면으로 띄워야 한다는 것이다. 일반적으로 프로그램은 응용 어플리케이션을 독립적으로 띄워도 상관없는 것이 대부분이다.


다운로드

Posted by 굿데이