유돌이

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31

Notice

2009. 5. 26. 20:24 델파이

uses
 
ActiveX, Shdocvw_tlb, MSHTML_TLB;

type
 
TObjectFromLResult = function(LRESULT: lResult; const IID: TIID; wParam: wParam;
    out pObject): HRESULT;
  stdcall;

function GetIEFromHWND(WHandle: HWND; var IE: IWebbrowser2): HRESULT;
var
 
hInst: HWND;
  lRes: Cardinal;
  Msg: Integer;
  pDoc: IHTMLDocument2;
  ObjectFromLresult: TObjectFromLresult;
begin
 
hInst := LoadLibrary('Oleacc.dll'); @ObjectFromLresult :=
    GetProcAddress(hInst, 'ObjectFromLresult');
  if @ObjectFromLresult <> nil then
  begin
    try
     
Msg := RegisterWindowMessage('WM_HTML_GETOBJECT');
      SendMessageTimeOut(WHandle, Msg, 0, 0, SMTO_ABORTIFHUNG, 1000, lRes);
      Result := ObjectFromLresult(lRes, IHTMLDocument2, 0, pDoc);
      if Result = S_OK then
       
(pDoc.parentWindow as IServiceprovider).QueryService(IWebbrowserApp,
          IWebbrowser2, IE);
    finally
     
FreeLibrary(hInst);
    end;
  end;
end;

 

 

[※ 참고]

: 프레임의 경우엔 프레임의 인터페이스를 얻는 방법과 Shell Embedding 이란 클래스 핸들을 얻어서 다시 Shell DocObject View 클래스 핸들을 얻고, 다시 Internet Explorer_Server 핸들을 얻으면 됩니다. 그러니까 프레임은 Shell Embedding 클래스 안에 Shell DocObject View가 여러개 있는게 되죠...^^;

 

 

 

 

출처 : http://skyrack.tistory.com/45#recentTrackback 

사진찍는 나귀

posted by 유돌이
2009. 5. 26. 20:23 델파이

1. 필요 unit


엑셀로 인한 추가 unit 2개 : ComObj, OleCtrls


2. 변수 선언


var

     XL : variant ;

begin

    XL := CreateOLEObject('Excel.Application');     // OLE컨트롤 생성
    XL.DisplayAlerts := False;          //경고창 숨기기

    XL.WorkBooks.Add;                   //새화일 열기

    XL.SaveAs('C:\test.xls');         //다른이름 저장

    XL.quit;            //엑셀 언로드 ---> exception 구간에서 사용하기 ! 안사용하면 메모리누수


3. 생각해야 될것 기타 값 입력 모양 변경 등등은


엑셀에 보면 도구 - 메크로 - 메크로 기록이라는 항목이 있는데


거기서 기록 을 누른 후 행동을 하고 ㅁ 버튼을 눌러 메크로 기록을 중지하면


기록된 메크로를 볼 수 있는데 (alt + F11)  여기서 만들어진 메크로를 적용 시키면 된다.



3번이 가장 중요 ! 즉 메크로 기록을 한후 역추적을 통해 코딩 ㄱㄱ



===================================================================================

이하 코드를 통하여 참조하여 주시기 바랍니다. ㄳ

===================================================================================

unit Unit1;

interface

uses
//    엑셀로 인한 추가 unit 2개 : ComObj, OleCtrls
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ComObj, OleCtrls, Grids, StdCtrls;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  Function  ReadExcelFile(sFileName:String):integer;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
begin
    ReadExcelFile('12.xls');
end;

function TForm1.ReadExcelFile(sFileName: String): integer;
var
  XL, XArr, XTitle : Variant;
  sheetNumer,x,y : Integer;
  temp : String;
begin
  sheetNumer:=1;
  temp := 'a1:a1';
  try
    XL := CreateOLEObject('Excel.Application');
    XL.DisplayAlerts := False;          //경고창 보이기
    XL.workbooks.add;                   //새화일 열기
    XL.ActiveCell.FormulaR1C1 := '=3*3';
    XL.ActiveCell.CurrentRegion.Select;
    XL.selection.style:='Currency';
    XL.Cells[1,3].value := '3';

    XL.Range['D22'].Select;
    XL.ActiveCell.FormulaR1C1 := 'wonsama';
    XL.Selection.Font.ColorIndex := 3;


//   참조항목
//    XL.workbooks.Add('C:\test.xls');    //특정 이름의 화일 열기
//    XL.workbooks.Open('C:\'+sFileName); //특정 이름의 화일 열기
//    XL.ActiveWorkbook.saveas('C:\123.xls'); //활성화된 엑셀 다른 이름으로 저장
//    XL.ActiveCell.FormulaR1C1 := '=3*3';    //값입력
//    XL.ActiveCell.Font.Bold := True      //글자 환경 변경
//    XL.ActiveCell.CurrentRegion.Select;   //활성화 된 셀의 영역을 선택
//    XL.selection.style:='Currency';       //선택영역 통화 형태로

  except
    result:= 0;
    MessageDlg('Excel이 설치되어 있지 않습니다.'+#13+'이 기능을 이용하시려면 반드시 MS오피스 엑셀이 설치되어 있어야 합니다.- ' , MtWarning, [mbok], 0);
    XL.quit;            //엑셀 언로드
    Exit;
  end;
  XL.Visible := true;
  XL:= Unassigned;
 end;
end.

 

 

출처 :: Posted by 내멋대로 코딩 나비 (http://skql.tistory.com/tag/Delphi%20Excel)춉춉 

posted by 유돌이
2009. 5. 26. 20:22 델파이

델파이6 기준으로 TexcelApplication,
TExcelWorkbook, TExcelWorksheet, TexcelChart 올려놓고 실행하면 됩니다.

uses절에 Activex 추가하시고 다음과 같이 코딩하면 됩니다.

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, excel2000, OleServer, Activex;

type
  TForm1 = class(TForm)
    Button1: TButton;
    ExcelApplication1: TexcelApplication;
    ExcelWorkbook1: TexcelWorkbook;
    ExcelWorksheet1: TexcelWorksheet;
    ExcelChart1: TexcelChart;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
  LCID,i : Integer;
  Sheet, Selection : Variant;
  Format : OleVariant;
  //차트용
  ChObj: ChartObject;
  SheetType: OleVariant;
  Rnge, ChType: OleVariant;
  Ax: Axis;
begin
  excelApplication1.Connect; //엑셀을 가동한다.(InVisible 상태)
  ExcelWorkbook1.connectto(excelApplication1.workbooks.add(TOleEnum(xlWBATWorksheet), LCID));
  ExcelWorksheet1.connectto(excelWorkbook1.worksheets.item['Sheet1'] as _worksheet );

  //워크시트 이름 변경
  excelWorksheet1.Name := '날 죽여라';
  excelApplication1.DisplayAlerts[LCID] := False;
  excelApplication1.Visible[LCID] := true;
  Sheet := ExcelApplication1.WorkBooks[ExcelApplication1.Workbooks.Count].WorkSheets[excelWorkbook1.Worksheets.Count];
  Sheet.Cells[1,1] := '엑셀서식';
  excelApplication1.Range['A1','A1'].borders.lineStyle := 1;
  excelApplication1.Range['A1','A1'].borders.Color := clNavy;
  excelApplication1.Range['A1','A1'].Interior.Color := clYellow;


  //폰트변경
  excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].font.bold := true;
  excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].font.Size := 20;
  excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].font.Name := '±A¼­';

  //우측정렬(가로정렬)
  excelApplication1.Range[Sheet.Cells[1,1],Sheet.Cells[1,1]].HorizontalAlignment := xlHAlignRight;


  //가운데정렬(세로정렬)
  excelApplication1.Range['B1','B1'].VerticalAlignment := xlHAlignCenter;

  //범위로 찍을 경우
  excelApplication1.Range['B1','C2'].Value := '123456789';

  //숫자형 포맷
  Format := '_-* #,##0.0_-;-* #,##0.0_-;_-* "-"???_-;_-@_-';

  '@'; //  테스트형식

  #,##0.0 // 숫자형식
  excelApplication1.Range['B1','B1'].NumberFormatLocal := Format;

  Sheet.Range['B2', 'C2'].Interior.Color := RGB(223, 123, 123);
  excelApplication1.Range['B4', 'C4'].Interior.Color := clSilver;

  //날짜 찍기
  Sheet.Cells[5,1] := '2002/5/6';
  Sheet.Cells[5,2] := '2002/5/6';

  //숫자형
  Sheet.Cells[5,3] := '12345';
  Sheet.Cells[5,4] := '12345';

  //날짜포맷
  Format := 'yyyy-mm-dd';
  excelWorksheet1.Range[Sheet.Cells[5,1], Sheet.Cells[5,1]].NumberFormat := Format;

  Format := 'mmmm d, yyyy';
  excelWorksheet1.Range[Sheet.Cells[5,2], Sheet.Cells[5,2]].NumberFormat := Format;

  // 스트링형으로 변경
  Format := '@';
  excelWorksheet1.Range[Sheet.Cells[5,3], Sheet.Cells[5,3]].NumberFormat := Format;

  excelWorksheet1.Range['B11','B11'].VerticalAlignment := xlHAlignCenter;
  excelWorksheet1.Range['B11','B11'].HorizontalAlignment := xlHAlignRight;
  excelWorksheet1.Range['B11','B11'].Value := '셀병합후 가운데(세로) 정렬';
  excelWorksheet1.Range['B11','B13'].MergeCells := true;
  excelWorksheet1.Range['B11','B13'].borders.LineStyle := 2;

  excelWorksheet1.Range['B15','B15'].borders.lineStyle := 0;
  excelWorksheet1.Range['B15','B15'].HorizontalAlignment := xlHAlignRight;
  excelWorksheet1.Range['B15','B15'].Value := '셀병합후 우측(가로) 정렬';
  excelWorksheet1.Range['B15','D15'].MergeCells := true;
  excelWorksheet1.Range['B15','D15'].borders.LineStyle := 1;

  excelWorksheet1.Range['F15','G20'].MergeCells := true;
  excelWorksheet1.Range['F15','F15'].Value := '다중셀병합';
  excelWorksheet1.Range['F15','G20'].MergeCells := true;
  excelWorksheet1.Range['F15','F15'].HorizontalAlignment := xlHAlignCenter;
  excelWorksheet1.Range['F15','F15'].VerticalAlignment   := xlHAlignCenter;
  excelWorksheet1.Range['F15','G20'].borders.Weight := 4;

  //라인 스타일
  for i := 0 to 13 do
  begin
    excelWorksheet1.Range['B'+inttostr((2*i)+16),'B'+inttostr((2*i)+16)].borders.lineStyle := i;
    excelWorksheet1.Range['B'+inttostr((2*i)+16),'B'+inttostr((2*i)+16)].Value := 'borders.lineStyle := '+inttostr(i);
  end;

  //border Weight
  for i := 1 to 4 do
  begin
    excelWorksheet1.Range['B'+inttostr((2*i)+42),'B'+inttostr((2*i)+42)].borders.lineStyle := 1;
    excelWorksheet1.Range['B'+inttostr((2*i)+42),'B'+inttostr((2*i)+42)].borders.Weight := 1;
    excelWorksheet1.Range['B'+inttostr((2*i)+42),'B'+inttostr((2*i)+42)].Value := 'borders.Weight := '+inttostr(i);
  end;

  //라인 위치
  excelWorksheet1.Range['D18','D18'].borders.Item[1].LineStyle := 1;
  excelWorksheet1.Range['D18','D18'].Value := 'borders.Item[1].LineStyle := 1';
  excelWorksheet1.Range['D20','D20'].borders.Item[2].LineStyle := 1;
  excelWorksheet1.Range['D20','D20'].Value := 'borders.Item[2].LineStyle := 1';
  excelWorksheet1.Range['D22','D22'].borders.Item[3].LineStyle := 1;
  excelWorksheet1.Range['D22','D22'].Value := 'borders.Item[3].LineStyle := 1';
  excelWorksheet1.Range['D24','D24'].borders.Item[4].LineStyle := 1;
  excelWorksheet1.Range['D24','D24'].Value := 'borders.Item[4].LineStyle := 1';

  //패턴 변경
  for i := 1 to 18 do
  begin
    excelWorksheet1.Range['D'+inttostr(i+24),'D'+inttostr(i+24)].Interior.Pattern := i;
    excelWorksheet1.Range['E'+inttostr(i+24),'E'+inttostr(i+24)].Value := 'Interior.Pattern := '+inttostr(i);
  end;

{ 이미지를 삽입할 경우 실제파일을 기록해야 되기 때문에 주석처리
  실제 파일과 경로명 기록하고 주석푸시고 싱행해보세요
  //백그라운드 이미지
  //excelWorksheet1.SetBackgroundPicture('C:\My Documents\My Pictures\couplevssolo(6).jpg');


  //이미지 입력
  Selection := Sheet.Pictures.Insert('C:\My Documents\My Pictures\302492_2.jpg');


  //이미지 위치 조절
  Selection.ShapeRange.IncrementLeft(243);
  Selection.ShapeRange.IncrementTop(605);
}

  //수식 입력
  Format := '#,##0.00_ ;-#,##0.00;_-* "-"???_-;_-@_-';
  excelApplication1.Range['F3','H8'].NumberFormatLocal := Format;

  excelWorksheet1.Range['F3', 'H8'].Formula := '=RAND()*10';
  excelWorksheet1.Range['F9', 'F9'].Formula := '=SUM(F3:F8)';
  excelWorksheet1.Range['G9', 'G9'].Formula := '=SUM(G3:G8)';
  excelWorksheet1.Range['H9', 'H9'].Formula := '=SUM(H3:H8)';
  excelWorksheet1.Range['I9', 'I9'].Formula := '=SUM(F9:H9)';


  excelWorksheet1.Range['F2', 'F2'].Value := '1학년';
  excelWorksheet1.Range['G2', 'G2'].Value := '2학년';
  excelWorksheet1.Range['H2', 'H2'].Value := '3학년';

  excelWorksheet1.Range['E3', 'E3'].Value := '1년';
  excelWorksheet1.Range['E4', 'E4'].Value := '2년';
  excelWorksheet1.Range['E5', 'E5'].Value := '3년';
  excelWorksheet1.Range['E6', 'E6'].Value := '4년';
  excelWorksheet1.Range['E7', 'E7'].Value := '5년';
  excelWorksheet1.Range['E8', 'E8'].Value := '6년';
  excelWorksheet1.Range['E3', 'E8'].HorizontalAlignment := xlHAlignRight;

  //차트용 오브젝트 생성
  ChObj := (excelWorksheet1.ChartObjects(EmptyParam, lcid) as ChartObjects).Add(600, 10, 400, 250);
  excelChart1.ConnectTo(ChObj.Chart as _Chart);


  //데이터 범위(데이터뿐만 아니라 가로축 세로축에 찍힐 주석값까지 포함)
  Rnge := excelWorksheet1.Range['E2','H8']; // the data range, including titles


  //차트타입
  ChType := TOleEnum(xl3DColumn);
  excelChart1.ChartWizard(Rnge, ChType, EmptyParam, xlColumns, 1, 1, True,
                          excelWorksheet1.Range['A1', 'A1'].Text, // The chart title
                          '번호', '점수', EmptyParam, lcid);
  Ax := excelChart1.Axes(xlValue, xlPrimary, lcid) as Axis;
  Ax.AxisTitle.Font.FontStyle := '굴림체';

  //자동 컬럼 폭 맞춤
excelWorksheet1.Range[ XL.Cells[1, 1], XL.Cells[ir, 9]].Select;

excelWorksheet1.Columns.AutoFit;
end;

end

 

 

 

출처 :: Posted by 내멋대로 코딩 나비 (http://skql.tistory.com/tag/Delphi%20Excel)

posted by 유돌이
2009. 5. 18. 13:15 PHP/Java Script/html
1. charset의 의미
charset = "coded character set"
charset은 "컴퓨터에서 문자를 표현하기 위해, 각 문자를 정수값에 대응시켜 놓은 체계"를 의미합니다.

예를 들어, euc-kr charset이라면, 영숫자와 한글 그리고 일부 특수문자와 한자들을 정수값에 대응해 놓은 것입니다.
euc-kr환경에서 한글을 입력하면, 컴퓨터는 euc-kr charset에서 각 문자별로 지정한 정수값을 쓰게 됩니다.

2. charset이 달라진다면..
각 charset별로, 표현하고자하는 문자와 대응하는 정수값이 달라질 수 있습니다.
예를들어 euc-kr은 태국문자를 위한 정수값을 정의하지 않았으므로, 태국문자는 표현하거나 입력할 수 없습니다.

그리고, euc-kr charset에 맞춰 한글로 어떤 내용을 작성했는데,
이것을 iso-8859-1 charset 환경에서 열어본다면, 한글 대신에 엉뚱한 특수문자쌍들을 보게 될 것입니다.

이런 문제 때문에, 문자 데이터를 주고 받을 때는 서로 간에 charset을 일치시킬 필요가 있습니다. 그렇지
않으면, 원래 생각했는 내용 대신 "깨진 문자들"을 보게 될테니까요.
( 가끔 charset은 일치되었는데, 사용하는 폰트에 대응하는 문자가 없어서 깨져보이는 경우도 있습니다. )

서블릿 코딩시에, content type의 일부로 charset을 명시하는 것은 웹 브라우저에게 사용하는 charset을
알려주어 오해하지 않게 하기 위해서입니다.

3. 한글을 표현할 수 있는 charset
한글을 표현할 수 있도록 설계된 charset은 euc-kr외에도, ksc5601, cp933, cp949 등등 꽤 많습니다.
그리고, 전세계 모든 문자를 표현할 목적으로 설계된 unicode역시 한글을 지원합니다.
그러나, 한글을 지원하는 charset을 사용하더라도, 문서를 만들 때 사용한 charset과 읽을 때 사용하는
charset이 다르다면, 제대로 그 내용을 볼 수 없을 것입니다. 이 경우에는 따로 conversion로직을 사용하여
원하는 charset에 맞춰 데이터를 가공해야 할 것입니다.
( euc-kr, ksc5601 같은 경우는 거의 차이가 없어 호환가능합니다. )

3. 영문 OS에서 한글 표현
charset에 맞추어 문자데이터를 처리하는 것은 OS나 DBMS, 미들웨어 등 플랫폼이므로, 플랫폼에서
제공해주지 않는 charset을 사용할 수는 없습니다.
다행히도, 최근의 플랫폼 SW들은 다양한 charset 지원을 포함하고 있습니다. 만약 어떤 OS가 euc-kr모드로
작동하고 있다면, 설령 영문OS라 하더라도, 한글 처리에 문제가 없다고 볼 수 있습니다.
문제가 있다면 euc-kr모드로 작동하고 있는 것이 아니겠죠.

저 같은 경우, 영문 OS를 설치하고, 그 위에서 한글을 사용해 본 적이 있습니다.

4. encoding
charset과 비슷한 의미로 사용하는 단어로 encoding이 있습니다.
charset이 문자에 대해 정수값을 지정한 것이라면,
encoding은 "문자를 표현하는 정수값을 어떤 bit배열로 표현할 것"인지를 의미합니다.

대부분의 경우, charset과 encoding을 구별할 필요가 없습니다. 왜냐하면 정수값을 bit배열로 표현하는 방법은
하나만 있을테니까요. 그러나 unicode 경우에는 UTF-8, UTF-16 같이 몇 가지 다른 encoding을 사용합니다.
charset이 같다면, 그 charset을 지원하는 어떤 encoding을 사용하든지, 각 문자에 대응하는 논리적인 정수값은 동일합니다.
그러나 실제로 기록되는 bit배열은 encoding에 따라 달라질 수 있습니다. 이 경우, 제대로 데이터를 주고 받으려면, charset뿐 아니라 encoding까지도 맞춰야 합니다.


posted by 유돌이
2009. 2. 9. 21:40 C/C++/MFC
미 아시겠지만, 세션에는 ASP.NET에는 3가지의 세션 모드를 지원하고 있습니다. 
 
1) InPro방식 , 2) StateServer방식, 3) SQLServer방식  
  1. 세션 저장방식 
    1) 웹서버의 메모리에 저장된다. 
     
    2) 분리된 프로세스(aspnet_state.exe)의 메모리에 serialize된 형태로 저장된다. 분리된 서버에 저장이 가능하다. 
     
    3) serialize된 형태로 SQL서버에 저장된다. 
     
  2. 성능 
    1) 속도가 가장 빠르다. 세션저장소가 웹서버의 메모리이므로 저장량이 많아질 경우 웹서버 처리속도에 영향을 미칠 수 있다. 
     
    2) 기본형식의 데이타(string, integer등)인 경우 기준으로 15%의 속도저하가 있다고 알려짐.  
    그렇지만, 일반 object를 저장할 경우, serialize/deserialize과정을 거쳐야 하므로 성능은 더욱 저하될 수 있다. 
     
    3) 기본형식의 데이타인 경우 기준으로 25%의 속도저하가 있다고 알려짐. 
    stateServer방식과 마찬가지로, 일반 object를 저장할 경우, serialize/deserialize과정을 거쳐야 하므로 성능은 더욱 저하됨. 
     
  3. 문제점 
    1) aspnet_wp 프로세스가 재기동(recycle)되면 세션상태가 사라짐(SP2: 비정상적 recycle을 해결함).  
    어플리케이션을 다시 시작해도 세션사라짐.  
    이유는 어플리케이션의 메모리영역에 세션을 저장하기 때문에, 어플리케이션이 재시작하면 메모리영역을 다시 할당받기 때문이다. 
     
    어플리케이션을 재시작되는 되는 사항 
     
           가) config파일의 수정(web.config, machine.config, global.asax등) 
           나) \bin 디렉토리 밑의 파일 수정(즉 컴파일을 새로 하게되면 세션 사라지는 큰 문제점이 있음) 
     
    2) Inproc방식의 세션사라지는 문제를 해결함. WebFarm환경에서 특정서버에 세션을 저장하게 하는 것을 가능하게 함. 
    그렇지만, 세션서버의 장애발생시 모든 웹서버의 세션이 작동안하는 문제점이 있음. 
     
    3) Inproc방식의 세션사라지는 문제를 해결함. SQL서버가 재기동되어도 세션 사라지지 않음. 
    또한 SQL서버의 클러스터링을 이용하면, 특정 SQL서버의 장애시에도 서비스 가능함. 
     
  4. 유의사항 
    1) Web Garden mode에선 제대로 동작안함.(주: Web Garden이란 프로세서(CPU) 독립적으로 aspnet_wp.exe가 실행됨) 
    WebGarden을 사용하려면, StateServer나 SQLSERVER로 바꾸어야 함. 
    Session_End 이벤트는 Inproc 모드에서만 동작한다. 
     
    2) Web Farm방식에서는 모든 웹서버들은 같은 machineKey를 가져야 한다. 
    또한 저장되는 객체가 serializable하는지 확인해야 한다. 
    Web Farm방식에서 다른 서버로 세션이 전달되기 위해서는 어플리케이션의 경로가 같아야 한다. 
     
    3) 저장되는 객체가 serializable하는지 확인해야 한다. 
    Web Farm방식에서 다른 서버로 세션이 전달되기 위해서는 어플리케이션의 경로가 같아야 한다. 
     
  5. 자주 묻는 질문 
    1) ASP와 ASP.NET의 세션을 공유할 수 있는지요..? 
    - 불가능합니다. 
     
    2) 서로 다른 웹어플리케이션 사이에 세션을 공유할 수 있는지요.. 
    - 불가능합니다. 
     
    3) Inproc방식에서 왜 가끔 세션값이 사라지나요? 
    - 어플리케이션의 recycle때문입니다. SP2에서 Fix 되었습니다. 
     
    4) 어떤 종류의 객체가 세션에 저장될 수 있나? 
    - 세션저장 방식에 따라 달라집니다. 
     
    Inproc방식에서는 어떤 객체라도 저장할 수 있으나,  
    StateServer와 SQLServer방식에서는 serializable한 객체만 저장될 수 있습니다. 
    사용자가 직접 만드는 클래스인 경우 serializable속성을 추가함으로써 저장이 가능하나,  
    제공되는 클래스인 경우 Object명.GetType.IsSerializable() 로써 알아볼 수는 있으나,  
    변경은 불가능한 것 같습니다. (확실하진 않습니다). 
     
    5) Serializable은 어떻게 지정하나? 
    - C# 
    [Serializable]  
    public class MyClass  
    {  
           //class code  
    }  
     
    - VB.NET 
    <Serializable()> _  
    Public Class MyClass  
           'Class code  
    End Class 
posted by 유돌이
2009. 2. 9. 21:38 C/C++/MFC

PostQuitMessage

원형 VOID PostQuitMessage(int nExitCode);
인수

▶nExitCode : 종료 코드. 이 값은 WM_QUIT의 wParam으로 전달되며 잘 사용되지 않으므로 보통 0으로 전달한다. 이 값은 메시지 루프 종료 후에 다시 WinMain의 리턴값으로 재사용되며 결국 프로세스의 종료 코드가 되는데 프로세스의 종료 코드도 사용되는 경우가 드물다.

리턴 리턴값이 없다.
설명

스레드 메시지 큐에 WM_QUIT 메시지를 붙이고 즉시 리턴한다. WM_QUIT 메시지를 큐에 붙임으로써 시스템에게 이 스레드가 종료될 것이라는 것을 미리 알려준다. 메시지 루프는 보통 WM_QUIT 메시지를 받으면 종료하도록 되어 있으므로 이 함수를 호출하면 메시지 루프가 종료된다. 특히 이 함수를 호출하는 스레드가 주 스레드일 경우는 주 스레드의 메시지 루프가 종료됨으로써 프로세스가 종료된다.

단, 이 함수는 메시지를 큐에 붙인 후 즉시 리턴하므로 호출 즉시 프로세스가 종료되는 것은 아니다. 즉 PostQuitMessage 호출 후 다른 처리를 계속할 수 있으며 이미 메시지 큐에 들어와 있는 모든 메시지가 처리된 후에 WM_QUIT 메시지가 읽혀져야 종료된다. 반면 ExitProcess 함수는 즉시 프로세스를 종료하기 때문에 이 함수 아래에 작성된 코드는 실행되지 않는다.

통상 이 함수는 메인 윈도우의 WM_DESTROY 메시지 처리 코드에 작성되어 메인 윈도우가 파괴되면 응용 프로그램을 종료하는 역할을 한다. 차일드 윈도우가 WM_DESTROY에서 이 메시지를 호출해서는 안된다. 그래서 DefWindowProc은 WM_DESTROY 메시지를 디폴트 처리할 때 PostQuitMessage를 호출하지 않도록 되어 있다.

참고함수 PostMessage, SendMessage
플렛폼 95이상
본문참조  

posted by 유돌이
2009. 2. 9. 21:37 C/C++/MFC

- ExitProcess() 

  1. 프로세스와 연결된 모든 DLL을 종료시키기 위해 각 DLL의 DllMain함수가 호출되며 DLL들은 스

     스로 정리작업을 한다.

  2. 모든 열려진 핸들을 닫는다.(핸들 테이블 제거)

  3. 실행중인 모든 쓰레드를 종료한다.

  4. 프로세스 커널 객체와 쓰레드 객체의 상태가 신호상태로 되며 이 신호를 기다리는 다른 프로세스 

     대기 상태를 해제할 수 있다.

  5. 프로세스의 종료코드는 STILL_ACTIVE에서 ExitProcess()인자로 지정한 값으로 변경된다.

  6. 곧바로 정리 작업에 들어가기 때문에 ExitProcess()함수의 다음 코드는 실행되지 않는다.

 

- PostQuitMessage()

   단지 메시지 맵에 WM_QUIT 메시지만 전달하는 것이기 때문에 다음 코드도 실행이 된다.

 

- TerminateProcess()

   1. 자기 자신이 아닌 다른 프로세스를 종료시킬 수 있다.

   2. 정리 작업을 하지 않기 때문에 되도록 금지되는 함수


'C/C++/MFC' 카테고리의 다른 글

인터페이스와 COM의 의미  (0) 2009.02.09
PostQuitMessage  (0) 2009.02.09
윈도우 핸들 구하는 방법  (0) 2009.02.09
트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
string::find와 string::npos 란?  (0) 2009.02.09
posted by 유돌이
2009. 2. 9. 21:37 C/C++/MFC
윈도우제목과 윈도우클래스명으로 윈도우핸들 찾기!

연결파일 : user32.dll
함수 :
   실수함수: FindWindowA(문자: 클래스명, 윈도우제목);
예제 : [클래스명이 'TNHForm'이고, 창 제목이 '창0'인 창을 찾습니다.]
   핸들 := 사용자함수0.FindWindowA("TNHForm", "창0");
주의 :
   만일 클래스명 및 윈도우제목도 같은 프로그램이 있다면 난감합니다;
참고 :
   더 상세한 함수를 원하신다면 FindWindowExA 를 참고해주세요.


윈도우제목과 윈도우클래스명으로 윈도우핸들 찾기[고급]!

연결파일 : user32.dll
함수 :
   실수함수: FindWindowExA(실수: 부모창, 다음창; 문자: 클래스명, 윈도우제목);
설명 :
   부모창 - 부모창의 핸들에서 자식 객체를 찾습니다. 사용 안할경우 0을 넣으시면 됩니다.
   다음창 - 여기에 특정 창의 핸들을 넣으시면 그 특정창 다음부터 창을 찾습니다.
               [동일한 클래스명과 제목명이 여러개 있을경우 편리합니다.]
               역시 사용안하시려면 0 을 넣으시면 됩니다.
   클래스명과 윈도우제목은 FindWindowA 와 동일합니다.
예제 : [클래스명이 'TNHForm'이고, 창 제목이 '창0'인 창을 찾습니다.]
   핸들 := 사용자함수0.FindWindowA(0, 0, "TNHForm", "창0");


특정 좌표에 있는 윈도우의 핸들찾기!

연결파일 : user32.dll
함수 :
   실수함수: WindowFromPoint(실수: X, Y);
예제 : [X좌표 200 Y좌표 300에 위치한 창의 핸들을 얻습니다.]
   핸들 := 사용자함수0.WindowFromPoint(200, 300);


현재 활성화된 창의 핸들 찾기!
연결파일 : user32.dll
함수 :
   실수함수: GetActiveWindow;
예제 :
   핸들 := 사용자함수0.GetActiveWindow;


현재 포커스[초점]이 있는 윈도우의 핸들찾기!

연결파일 : user32.dll
함수 :
   실수함수: GetFocus;
예제 :
   핸들 := 사용자함수0.GetFocus;


가장 앞에있는 창의 윈도우핸들 찾기!

연결파일 : user32.dll
함수 :
   실수함수: GetForegroundWindow;
예제 :
   핸들 := 사용자함수0.GetForegroundWindow;



그외, 함수를 구하는 방법에는 여러가지가 있습니다.
다음창의 핸들구하기, 이전창의 핸들구하기
부모창의핸들 구하기, 데스크탑윈도우 핸들구하기
가장 처음창의 핸들구하기, 가장 마지막창의 핸들구하기
소유 윈도우의 핸들구하기 등등..


여러가지 방법등이 있지만, 가장 많이쓰는 것들을 소개해봤습니다.

Tip & 팁!)
   가장 고질병인 ㅎ밑판등의 핸들 구하기!..
   밑판의 핸들구하려고, 창조웹브라우저의 함수를 사용하거나, 여러가지 방법으로 어렵게
   핸들속성이 없는 객체의 핸들을 구하셨나요?-_-;

   ㅎ밑판의 핸들구하기!.. :
       밑판0.활성화해;
       핸들 := 사용자함수0.GetFocus;

'C/C++/MFC' 카테고리의 다른 글

PostQuitMessage  (0) 2009.02.09
ExitProcess(), TerminateProcess(), PostQuitMessage() 차이점  (0) 2009.02.09
트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
string::find와 string::npos 란?  (0) 2009.02.09
DoModal() 이란??  (0) 2009.01.14
posted by 유돌이
2009. 2. 9. 21:35 C/C++/MFC

String::find()를 통하여 원하는 단어나 문장을 검색후

원하는 값의 유무를 string::npos()를 통하여 알수 있다.

 

string::find()함수는 찾는 단어나 문자열이 없으면 

string::npos를 리턴한다.

 

 

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

예제)

 

string str_text = "테스트 입니다."

 

if ( str_text.find("텍스트") == string::npos) {

    MessageBox("문자를 찾을수가 없습니다.", "테스트",  MB_OK);

}


'C/C++/MFC' 카테고리의 다른 글

윈도우 핸들 구하는 방법  (0) 2009.02.09
트레이로 가는 애니메이션 출력하기  (0) 2009.02.09
DoModal() 이란??  (0) 2009.01.14
C_STR() 이란??  (0) 2009.01.10
연결리스트 삽입,삭제 구현 예제(스택)  (0) 2009.01.10
posted by 유돌이
2009. 1. 6. 08:44 유닉스*리눅스*SE

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

#!/bin/sh
echo -n "당신의 이름은? "
read name
echo -n "당신의 나이는? "
read age

echo 이름 : $name
echo 나이 : $age

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

예제2는 read 명령을 이용해서 키보드로부터 값을 읽어드린후
그 값을 변수에 저장하고 출력해보는 것이다.


'유닉스*리눅스*SE' 카테고리의 다른 글

[centos7] yum 명령어 안될시~  (0) 2019.09.12
[우분투 16.04] SSD 마운트 하기  (0) 2019.09.11
[안드로이드] 커널로그 보기  (0) 2019.09.11
cp시 omitting error 날때  (0) 2009.01.05
유닉스 명령어  (0) 2009.01.05
posted by 유돌이
prev 1 2 3 4 next