posted by 방랑군 2010. 2. 26. 15:40
C# 윈폼에서 DataGridView Data를 Excel 파일로 저장하는 소스를 알려 드리겠습니다. 순수하게 제가 만든건 아니고 여러 사이트에서 소스를 참조해서 제 상황에 맞게끔 응용을 했습니다.

제가 MS 오피스 2007 에 Visual Studio 2008 을 쓰기 때문에 이를 기준으로 소개를 하겠습니다.

먼저 솔루션 탐색기에서 참조추가를 합니다.

솔루션탐색기->참조추가->COM->Microsoft Excel 12.0 Object Libary 선택



이후 아래 소스를 적용하시면 됩니다.

using System.Reflection;
using Excel = Microsoft.Office.Interop.Excel;

private void ExportExcel(bool captions)
{
    this.saveFileDialog.FileName = "TempName";
    this.saveFileDialog1.DefaultExt = "xls";
    this.saveFileDialog1.Filter = "Excel files (*.xls)|*.xls";
    this.saveFileDialog1.InitialDirectory = "c:\\";

    DialogResult result = saveFileDialog.ShowDialog();

    if (result == DialogResult.OK)
    {
        int num = 0;
        object missingType = Type.Missing;

        Excel.Application objApp;
        Excel._Workbook objBook;
        Excel.Workbooks objBooks;
        Excel.Sheets objSheets;
        Excel._Worksheet objSheet;
        Excel.Range range;

        string[] headers = new string[dataGridView.ColumnCount];
        string[] columns = new string[dataGridView.ColumnCount];

        for (int c = 0; c < dataGridView.ColumnCount; c++)
        {
            headers[c]=dataGridView.Rows[0].Cells[c].OwningColumn.HeaderText.ToString();
            num = c + 65;
            columns[c] = Convert.ToString((char)num);
        }

        try
        {
            objApp = new Excel.Application();
            objBooks = objApp.Workbooks;
            objBook = objBooks.Add(Missing.Value);
            objSheets = objBook.Worksheets;
            objSheet = (Excel._Worksheet)objSheets.get_Item(1);

            if (captions)
            {
                for (int c = 0; c < dataGridView.ColumnCount; c++)
                {
                    range = objSheet.get_Range(columns[c] + "1"Missing.Value);
                    range.set_Value(Missing.Value, headers[c]);
                }
            }

            for (int i = 0; i < dataGridView.RowCount - 1; i++)
            {
                for (int j = 0; j < dataGridView.ColumnCount; j++)
                {
                    range = objSheet.get_Range(columns[j] + Convert.ToString(i + 2),
                                                           Missing.Value);

                    range.set_Value(Missing.Value,
                                          dataGridView.Rows[i].Cells[j].Value.ToString());

                }
            }

            objApp.Visible = false;
            objApp.UserControl = false;

            objBook.SaveAs(@saveFileDialog.FileName,
                      Microsoft.Office.Interop.Excel.XlFileFormat.xlWorkbookNormal,
                      missingType, missingType, missingType, missingType,
                      Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
                      missingType, missingType, missingType, missingType, missingType);
            objBook.Close(false, missingType, missingType);

            Cursor.Current = Cursors.Default;

            MessageBox.Show("Save Success!!!");
        }
        catch (Exception theException)
        {
            String errorMessage;
            errorMessage = "Error: ";
            errorMessage = String.Concat(errorMessage, theException.Message);
            errorMessage = String.Concat(errorMessage, " Line: ");
            errorMessage = String.Concat(errorMessage, theException.Source);

            MessageBox.Show(errorMessage, "Error");
        }
    }


posted by 방랑군 2010. 2. 26. 15:39
네트웍 프로그램을 개발할시 Connect 로 접속할때 IP가 살아 있지 않으면 딜레이가 많이 생깁니다. 하나의 IP에 단발성으로 Connect 를 할거면 딜레이가 생겨도 상관이 없지만 여러 IP에 Connect 를 시도 해야할때는 이 딜레이 때문에 프로그램이 꼭 다운된듯한 느낌이 들어 사용자에게 오해를 불러 일으킬수 있는 요지가 있어 이 딜레이를 없애는게 좋은거 같습니다. 

C# 내부 함수로는 이 딜레이를 없애는 방법은 없는거 같습니다. 그럼 방법은 ping 을 날려 보고 살아 있으면 Connect를 하고 죽어있으면 다른 IP로 넘어 가는 방법을 택해야 하는거 같습니다.

C#에서 Ping Test Code 입니다.

public bool Connect(string ip, int port)
{
    try
    {
        //IP Address 할당 
        this.ipAddress = IPAddress.Parse(ip);

        //TCP Client 선언
        this.tcpClient = new TcpClient(AddressFamily.InterNetwork);

        Ping pingSender = new Ping();
        PingOptions options = new PingOptions();

        // Use the default Ttl value which is 128,
        // but change the fragmentation behavior.
        options.DontFragment = true;

        // Create a buffer of 32 bytes of data to be transmitted.
        string data = "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
        byte[] buffer = Encoding.ASCII.GetBytes(data);
        int timeout = 120;
        PingReply reply = pingSender.Send(this.ipAddress, timeout, buffer, options);
        
        if (reply.Status == IPStatus.Success)
        {
            // Ping 성공시 Connect 연결 시도
            this.tcpClient.NoDelay = true;
            this.tcpClient.Connect(ipAddress, port);

            this.ntwStream = tcpClient.GetStream();               
        }
        else
        {
            // Ping 실패시 강제 Exception
            throw new Exception();
        }

        return true;
    }
    catch (Exception ex)
    {
        //MessageBox.Show("Connect Fail... : " + ex);
        return false;
    }
}

참고한자료 : 
msdn - Ping 클래스(System.Net.NetworkInformation)
posted by 방랑군 2009. 12. 28. 09:39

XP모드라는 것이 가상화를 이용한 기술이므로, CPU가 가상화를 지원해야 하고, Bios에서 Enable이 되어 있어야 합니다.

세가지 정도의 바이오스 화면을 찾아 보았는데요. 나머지 시스템들도 별반 다를 것이 없으니 아래 화면을 참고해서 Virtualization을 Enable로 설정 하시기 바랍니다.

 

[DELL Bios 화면]

 

※ 표시된 Disabled 설정을 Enabled로 변경 하시기 바랍니다.

 

※ 마찬가지로 Enabled로 변경 하세요.

posted by 방랑군 2009. 10. 22. 13:19

참조 :  http://cciijj.tistory.com/86


프록시 서버를 간단히 구축할 수 있습니다.

프록시 서버는 요즈음에는 보통 아이피를 바꾸기 위한 용도로 많이 이용됩니다. 나의 컴퓨터가 A 라고 하고 프록시 서버가 설치된 컴퓨터를 B 라고 하면 내가 B 컴퓨터에 접속을 하여 google.com 에 접속할 수 있습니다. 이 경우 google.com 에는 프록시 서버를 구축할 때 설정에 따라 프록시를 경유했는지 여부를 알 수도 모를 수도 있고 또 A 컴퓨터의 아이피가 노출될 수도 노출되지 않을 수도 있습니다.

http://www.linksmile.com/anon-proxy-checker.php
에 보시면 다음 항목에서 검출되지 않으면 완벽히 B 컴퓨터에서 접속한 것으로 인식됩니다.

BASIC anonymous proxy test variables (both must be "Not Detected" or "127.0.0.1")
HTTP_FORWARDED
HTTP_X_FORWARDED_FOR

HIGH anonymous proxy test variables (all must be "Not Detected")
HTTP_VIA
HTTP_XROXY_CONNECTION
HTTP_PROXY_CONNECTION
또 나의 컴퓨터가 A 라고 하고 감시를 원하는 컴퓨터를 C 라고 하면 내 컴퓨터에 프록시 서버를 설치하고 'transparent', '로그남김'으로 설정 후, C 컴퓨터 브라우저 설정을 내 컴퓨터 아이피주소로 하면 C 컴퓨터의 서핑 내역 로그를 A 컴퓨터에 남길 수 있습니다.

프록시 서버를 제공하는 곳이 여럿 있지만 속도는 매우 느리고 서버 제공자를 신뢰할 수 없으므로 사용이 꺼려집니다. 아이피를 바꾸고 싶다면 또는 프라이버시를 지키고 싶다면 합법적 범위 안에서 프록시 서버를 구축해서 인터넷을 이용할 수 있습니다. 좀 무책임한 말인지도 모르겠지만 '살인은 칼을 사용하는 사람의 책임이지 칼을 만들 사람의 책임은 아니다'라고 기어들어가는 목소리로 말하고 싶군요. 선택은 열려 있고 판단은 각자 해야 한다는 생각합니다.

외국의 모회사와 국내의 모 회사는 프록시 서버를 구축하고 완전한 프라이버시를 유료로 제공합니다. 그 회사들이 로그를 남기는지 안 남기는지는 모르겠지만, 완전한 프라이버시를 원하는 수요자 있음을 말해줍니다. 저 또한 요즘 추진 중인 통신법 개정에 반대합니다. 진보넷의 경우 접속자의 로그를 남기지 않는 걸로 압니다. 제 경우 테러를 대비한 로그를 남기기는 하지만 며칠 후면 삭제되게 해 두고 있습니다.

freeproxy는 http://www.handcraftedsoftware.org에서 다운로드 할 수 있습니다.


자세한 설정법은 열정의 부족으로 설명을 생략하겠습니다. 설정에서 인증을 거칠 것인지, 완벽한 익명성을 보장할 것인지, 로그를 남길 것인지 등을 설정할 수 있습니다.

(ver 3.81 기준 - 요즈음 바뀐지는 확인하지 않았습니다.)
default.cfg는 모든 설정이 다 들어있습니다. 그림의 창에서 모든 설정을 마무리했다면 default.cfg, freeproxy.exe, freeproxyftp.tem 을 확보한 후 다음의 명령으로 다른 컴퓨터에 간단히 설치할 수 있습니다. 3개의 파일만 있으면 동작하고 윈도의 서비스로 기동하게 됩니다.
freeproxy.exe -install default.cfg
posted by 방랑군 2009. 10. 22. 12:46

Microsoft Windows 2003 Server 설치 및 최적화 설정

 

Microsoft Windows 2003 Server을 안정성 > 사용상 편의 / 속도 > 시각적 효과적으로 최적화 설정을 정리.
주관성에 집중되어 있으므로 차이에 따라 본인의 사용 용도에 따라 설정도 가능하다. 
Microsoft Windows 2003 Server은 서버용 운영체제이므로 기본적인 음성, 그래픽 혹은 자바등의 구성이 제외 되어 있거나 비활성화 되어있다.
- 음성/테마 적용 및 자바 설치등을 설정하면 XP와 비슷한 환경으로 설정 가능.

* 기본적으로 Microsoft Windows 2003 Server는 저사양에서도 Microsoft Windows 2000 Server나 Microsoft Windows XP 제품군보다 훨씬 빠른 속도와 확장성 보여준다.

운영체제 설치 개략

* 운영체제를 설치 할 때에는 반드시 인터넷이 연결되지 않은 상태에서 설치하며 웜패치 및 보안패치를 반드시 설치.

* 하드웨어 칩셋 패치를 반드시 설치. 시스템의 성능의 향상.
* 설치 후 백신 프로그램을 설치. Microsoft Windows XP 제품군과는 다르게 서버용 백신을 설치.
* 드라이버는 최신 사양으로 설치. 하지만 드라이버와 운영체제간의 호환성 문제로 인해 윈도우즈 업데이트를 통한 드라이버 설치를 권장.
* DirecX 설치 후 여러가지 소프트웨어를 설치.
* 비활성화 목록을 활성화.

 

Step 01. Microsoft(R) Windows 2003 설치 버전 확인
시작 > 실행 > winver을 입력.
(예) Microsoft(R) Windows 버전 5.2(빌드 3790.srv03_rtm.030324-2048)

 

Step 02. 멀티 부팅시 유의 및 부팅순서/운영체제 목록 표시시간 설정
-자신의 주로 사용할 운영체제를 기본으로 설정하고 운영 체제 목록을 표시할 시간을 설정 변경.
컴퓨터 > 속성 > 고급 > 시작 및 복구 > 설정 > 시스템 시작 에서 설정.
※ 멀티 부팅 유의사항은 반드시 C Drive(마스터)는 Microsoft(R) Windows 2003보다 하위 버젼 설치 후 D drive(슬레이브) Microsoft(R) Windows 2003설치.
상하위 버전을 바꾼 상태로 설치 시 상위버전이 실행되지 않음.

 

Step 03. 시스템 설정
-DirectX 활성화
시작 > 실행 > dxdiag > 확인하여 DirectX 진단 도구를 실행하고 디스플레이 탭을 선택하고 
DirectX 기능이라는 항목에 DirectDraw 가속, Direct3D 가속, AGP 질감 가속 기능을 모두 사용 선택하고 
소리 탭에서 DirectX 기능 항목에 하드웨어 소리 가속 수준을 최대로 변경.

-시스템의 설정 변경
내 컴퓨터 > 속성 > 고급 > 시작 및 복구 항목에 설정(T) 선택 한 후 디버깅 정보 쓰기 항목에 작은메모리덤프(64KB)로 변경.
내 컴퓨터 > 속성 > 고급 > 성능 항목에 설정(S) 선택 한 후 고급탭에 프로세서 사용 계획, 메모리 사용 계획 항목을 모두 프로그램.

-서비스 항목설정
시작 > 실행 > services.msc > 확인 > 서비스를 실행하고 서비스(로컬)에서 아래 항목들을 변경.
(o):자동 (*):수동 (x):사용안함
Alerter(x) : 선택된 사용자와 컴퓨터에 관리 경고를 알립니다.
Automatic Updates(x) : 중요한 windows업데이트를 자동으로 다운로드하고 설치할 수 있도록 합니다.
Error Reporting Service(x) : 예상치 못한 응용프로그램 오류를 모으고 저장하거나 microsoft에 보고합니다.
Help and Support(*) : 도움말 및 지원센터를 실행 할 수 있도록 합니다.
IMAPI CD-Burning COM Service(*) : IMAPI를 이용하여 CD굽기를 관리합니다.
Messenger(x) : 클라이언트와 서버 사이에 net send및 경고 서비스 메시지를 전송합니다.
Portable Media Serial Number(x) : 이 컴퓨터에 연결된 어떠한 Portable Media Player의 일련번호를 검색합니다.
Protected Storage(x) : 개인키와 같은 중요한 정보를 보호하고 허가되지 않은 서비스, 프로세스, 사용자 액세스를 방지합니다.
Remote Registry(x) : 원격사용자가 이 컴퓨터에서 레지스트리 설정을 수정할 수 있도록 설정합니다.
Secondary Logon(x) : 다른 자격 증명에서 프로세스를 시작할 수 있도록 합니다.
Windows Image Acquisition(WIA) : 스캐너 및 카메라에 대한 이미지 인식 서비스를 제공합니다.
Windows Time(x) : 네트워크 상에서 모든 클라이언트 및 서버의 날짜 및 시간 동기화를 유지합니다.

-Theme 서비스 및 Audio 서비스 활성화
시작 > 실행 > services.msc > 확인 > 서비스 > 서비스로컬에서 themes > 자동으로 설정.
시작 > 실행 > services.msc > 확인 > 서비스 > 서비스로컬에서 windows audio > 자동으로 설정.

-디스플레이 설정
자신의 최신 그래픽 드라이버를 설치.
시작 > 제어판 > 디스플레이 > 디스플레이 등록정보 > 설정 > 고급(V)를 선택 한 후 문제해결 탭에서 하드웨어 가속 항목에 
하드웨어 가속(H)를 최대로 변경.
※ DirectX가 설치가 되어있어야 함.

-사운드 설정
자신의 최신 사운드 드라이버를 설치.
시작 > 제어판 > 사운드 및 오디오장치 > 볼륨 > 스피커 설정 항목에서 고급(D)...를 선택 한 후 성능 탭에서 오디오 재생 항목에
하드웨어 가속을 최대로 변경.
※ DirectX가 설치가 되어있어야 함.

-자바가 실행 불가능 할 시(예:다음카페에서 cafe on이 되지않는 경우)
자바의 저작권 문제로 제외 되었던 마이크로 소프트 버추얼머신을 설치.
※ 인터넷 공개자료실같은 사이트에서 쉽게 다운로드 가능.

 

Step 04. 최적화 팁 (윈도우 부분)
- 1차 가상메모리 설정
제어판 > 시스템 > 고급 > 성능탭에서 설정(S) 선택 한 후 성능 옵션을 실행하고 고급탭에 가상 메모리항목을 1GB를 기준으로 1536MB / 1536MB의 스와핑드라이브를 지정.

-오류 보고 설정 해제
제어판 > 시스템 > 고급 > 오류보고(R) 선택 한 후 오류 보고를 실행하고 오류 보고 사용 안 함 선택.

-자동 시스템 재부팅 설정 해제
제어판 > 시스템 > 고급 > 시작 및 복구항목에서 설정을 선택 한 후 시스템 오류 항목에서 자동으로 다시 시작을 선택 해제.

-시각 효과 설정
제어판 > 시스템 > 고급 > 성능항목에서 설정을 선택 한 후 성능옵션을 실행하고 시각 효과탭에서 최적 성능으로 조정(P)을 선택.
제어판 > 디스플레이 설정 > 화면배색 > 효과를 선택 하여 효과를 실행하고 모두 선택 해제.

-시스템 시작 시 ctrl+alt+del 설정 해제 
시작 > 실행 > gpedit.msc 입력 > 그룹정책개체편집기 > 컴퓨터구성 > windows설정 > 보안설정 > 로컬정책 > 보안옵션 > 대화형로그온 : [ctrl+alt+del]을 사용할필요없음 > 더블클릭 > 사용으로 선택 합니다.

-시스템 종료 시 이벤트 추적기 표시 설정 해제
시작 > 실행 > gpedit.msc입력 > 그룹정책개체편집기 > 컴퓨터구성 > 관리 템플릿 > 시스템 > 우측창에서 시스템 종료이벤트 추적표시 더블클릭 > 사용 안함으로 변경합니다.

-로그온 시 암호 설정 해제
시작 > 실행 > control userpasswords2 > 확인 > 사용자계정 > 사용자이름과 암호를 입력해야 이 컴퓨터를 사용할수 있슴에 선택를 해제함 > 확인 > 창이 하나 나오면 여기에 설치시 설정한 암호를 적고 확인 합니다.

-Internet Explorer 세팅 및 인터넷 최적화 
* 도구 > 인터넷 옵션 > 일반 > 임시 인터넷 파일항목에서 설정 > 임시 인터넷 파일 폴더항목에서 사용할 디스크 공간을 자신의 하드디스크 용량에 맞춰 폴더 변경 및 적당한 공간  설정.
* 도구 > 인터넷 옵션 > 일반 > 열어본 페이지 목록항목에서 페이지 보관 일수를 적당히 설정.
* 도구 > 인터넷옵션 > 보안 > 인터넷 보안을 보통으로 변경.
※ 제어판 > 프로그램 추가/제거 > windows 구성요소 추가/제거 > windows구성요소 마법사 > Internet Exporer 보안 강화 구성을 선택 해제하고 자세히를 선택하여 관리자 그룹용과 기타사용자 그룹용 선택 해제 한 후 다음을 선택하면 인터넷옵션 보안에는 보통으로 변경 가능.
* 도구 > 인터넷 옵션 > 개인정보탭에서 설정항목을 낮음으로 설정.
* 도구 > 인터넷 옵션 > 연결 > LAN설정항목에서 자동 구성, 프록시 서버 모든 선택를 해제.
* 도구 > 인터넷 옵션 > 프로그램 > 시작할때 기본 브라우저 확인에 선택 해제.
* 도구 > 인터넷 옵션 > 고급 에서
> 멀티미디어 > 이미지 크기 자동조정가능에 선택 해제.
> 보안 > 브라우저 닫을때 임시 인터넷 파일 폴더 비우기에 선택. (시스템을 항상 유지시킬 분만 추천)
> 탐색 > 예약시 동기화할 오프라인 항목 사용에 선택해제.
> 탐색 > 웹페이지 단추 및 컨트롤 시각 스타일 사용에 선택해제.
> 탐색 > 인라인 자동 완성사용에 선택해제.
> 탐색 > 주소표시줄에 [이동] 단추 표시에 선택 해제.
> 탐색 > 타사브라우저 확장 사용에 선택 해제.(다시 시작해야 함)
> 탐색 > URL을 항상 UTF-8로 보냄에 선택 해제.

-작업표시줄의 인터넷 익스플로러창 합쳐지는것 막기
시작 > 제어판 > 작업표시줄 및 시작메뉴 > 같은 종류의 작업 표시줄 단추를 그룹(G)으로에 선택 표시 해제.

-미리 보기 캐쉬로 인한 메모리 사용량 과대 방지
윈도우탐색기 > 도구 > 폴더 옵션을 실행 한 후 미리 보기 캐쉬 안 함 선택.

-내 문서 폴더 저장위치 변경하기
내 문서 > 속성 > 대상 폴더 위치에서 변경.

-탐색기의 폴더 옵션 설정 
탐색기 > 도구 > 폴더옵션 > 보기 > 고급옵션 >
보호된 운영체제 파일 숨기기에 선택 해제,
숨김 파일 및 폴더 표시에 선택,
시스템 폴더 내용 표시에 선택,
알려진 파일 형식의 확장명 숨기기에 선택 해제,
암호화 되거나 압축된 NTFS 파일을 컬러로 표시에 선택 해제,
폴더 및 바탕 화면 항목에 팝업설명표시에 선택 해제,
폴더팁에 파일 크기 정보 표시에 선택 해제.
폴더 보기 항목에 모든 폴더에 적용을 선택.

-휴지통 설정
휴지통 > 속성 > 일반설정 > 휴지통의 최대 크기를 5%로 삭제 확인 대화상자 표시에 선택를 해제 합니다.

-XP 처럼 디스플레이 사용하기
내컴퓨터 > 속성 > 고급 > 성능 > 설정 > 시각효과 > 두번째 최적모양으로설정 > 선택 > 확인합니다.

-윈2003 작업중단방지
* 제어판 > 디스플레이 > 디스플레이 등록정보 > 화면보호기 > 다시 시작할 때 암호로 보호에 선택를 해제 합니다. 
* 제어판 > 디스플레이 > 디스플레이 등록정보 > 화면보호기 > 전원 > 고급 > 컴퓨터가 대기 모드에서 나올 때 암호로 묻기에 선택 해제 합니다.

-내문서나 미디어플레이어 사용후에 흔적 지우기.
시작 > 실행 > gpedit.msc > 그룹정책개체편집기 > 사용자구성 > 관리템플릿 > 작업표시줄및시작메뉴
* 종료시 최근에 사용한문서 기록지우기를 더블클릭 > 사용선택후 확인
* 최근에 사용한 문서 기록을 보관안함을 더블클릭 > 사용선택후 확인

-종료 속도 빠르게 하기
시작 > 실행 > gpedit.msc > 그룹정책개체편집기 > 컴퓨터구성 > 관리템플릿 > 시스템 > 사용자프로필 > 프로필 언로드 및 
업데이트의 재시도 최대횟수를 더블클릭 > 사용을 선택후 재시도횟수를 0 으로 수정합니다.

 

Step 05. 최적화 팁 (레지스트리 부분)

[1] 메뉴 팝업속도 향상하기
HKEY_CURRENT_USER\ControlPanel\desktop - MenuShowDelay → 0

[2] MSIE 로딩속도(DNS 캐쉬수정) 향상하기
* HKEY_LOCAL_MACHINE\System\CurrentControlset\Services\Dnscache\Parameters
새로만들기(DWORD - 10진수) 
CachehHashTableBucketSize---->1 
CachehHashTableSize---------->384 
MaxCacheEntryTtlLimit-------->64000 
MaxSOACacheEntryTtlLimit----->301 
* HKEY_USER\.Default\Software\Microsoft\Windows\CurrentVersion\InterSettings
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\InterSettings
새로만들기(DWORD - 16진수) 
MaxConnectionsPerSever------>20 
MaxConnectionsPer1_0Sever--->20 
* HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\RemoteComputer\
NameSpace에서 {D6277990-4C6A-11CF-8D87-00AA0060F5BF} 폴더 자체를 삭제

[3] 폴더창 팝업속도 향상하기
HKEY_CURRENT_USER\Control Panel\desktop\windowmetrics 
새로만들기(문자열 값) 
MinAnimate ----> 0

[4] 아이콘의 화면출력(Refrash rate) 속도향상하기
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Update 
UpdateMode ----> 0

[5] L2캐쉬 지정으로 속도향상하기
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\MemoryManagement 
SecondLevelDataCache ----> L2 캐쉬값 입력 (예:512)

[6] 디스크 캐쉬 세부 설정 - 하드속도 향상하기
별도의 하드 캐쉬 램이 있는 사용자(레이드 카드에 램이 장착된 경우)는 필요없습니다.
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management 
IoPageLockLimit ----> 40000(512MB기준)

[7] 로그온 메시지
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Winlogon
새로만들기(문자열 값) 
LegalNoticeText ----> 더블클릭후 편집상자에 메시지 입력

[8] 공유문서 삭제/감추기
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MyComputer\NameSpace\DelegateFolders
59031a47-3f72-44a7-89c5-5595fe6b30ee ----> 삭제

[9] 도움말메뉴 삭제하기
HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Policies\Explorer
새로만들기(DWORD - 10진수) 
NoSMHelp ----> 1 (0으로 하면 복원됨)

[10] 최근문서메뉴 삭제하기
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
새로만들기(DWORD - 10진수) 
NoRecentDocsMenu ----> 1

[11] 입력도구모음/고급텍스트 삭제
* 시작 메뉴바에서 입력도구모음 언선택 
* cmd>%SystemRoot%\System32\Regsvr32.exe /u %SystemRoot%\System32\msimtf.dll 
%SystemRoot%\System32\Regsvr32.exe /u %SystemRoot%\System32\msctf.dll 
* RegSvr32 확인 
* Ctrl-Alt-Del(작업관리자) - 프로세스 - ctfmon.exe - 끝내기 - 확인 
* HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run - ctfmon.exe 삭제

[12] 윈도즈 메신져 삭제메뉴 추가
windows/inf/sysoc.inf 
msmsgs=msgrocm.dll,OcEntry,msmsgs.inf,hide,7 `hide` 제거 
msmsgs=msgrocm.dll,OcEntry,msmsgs.inf,7

[13] 종료 빠르게 하기
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\WaitTokillServiceTimeout : 20000 → 2000 로 수정

[14] 무응답 응용프로그램 타임아웃 시간줄이기
HKEY_CURRENT_USER\Control Panel\Desktop에서 HungAppTimeout 값 5000(5초) → 1000 (1000 = 1초) 로 수정 

posted by 방랑군 2009. 10. 7. 10:47

미니 팝업창

트레이 아이콘


모니터 제어

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        // 모니터 ON/OFF 관련

        const int WM_SYSCOMMAND = 0x0112;
        const int SC_MONITORPOWER = 0xF170;
        const int MONITOR_ON = -1;
        const int MONITOR_OFF = 2;
        const int MONITOR_STANBY = 1;

        [System.Runtime.InteropServices.DllImport("User32")]
        private static extern int SendMessage(int hWnd, int hMsg, int wParam, int lParam);

        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            SendMessage(this.Handle.ToInt32(), WM_SYSCOMMAND, SC_MONITORPOWER, MONITOR_OFF);
        }
    }
}

posted by 방랑군 2009. 9. 29. 13:13

참조 : http://kingcrap.com/entry/닷넷에서-native-dll-사용하기



닷넷에서 C/C++로 작성된 dll을 사용하고자 할 경우 다음과 같은 방법이 있다.

1. 일반적인 native dll의 경우 - P/Invoke (Platform Invoke)를 써서 직접 호출
닷넷에서 Win32 API를 호출하거나 C/C++로 작성된 native dll을 호출할 경우, native dll이 제공하는 메소드의 signature나 타입에 대해 닷넷에서 인식하고 호출할 수 있도록 이에 대한 선언을 해야 한다. 크게 보면 세 단계로 구성되는데, 첫째 DllImport하여 필요한 dll 로딩하는 부분, 둘째 원하는 메소드 signature를 extern으로 선언하는 부분(즉, 이 메소드가 외부 native dll에서 정의되어 있다고 선언하는 부분), 마지막으로 이 메소드를 호출하여 원하는 값을 취하는 부분으로 되어 있다.

Win32 API에 대한 선언을 일일이 기억하기란 쉽지 않기 때문에 웹에 이에 대한 데이터베이스 형태의 wiki로서 PInvoke.net이 존재한다. 아래 화면은 http://www.pinvoke.net 에서 볼 수 있다.pinvoke 
아울러 PInvoke.net에서는 Visual Studio 2005에 대한 플러그 인을 제공하여 무료로 다운받아 설치할 수 있으며 아래 그림에서 처럼 VS내에서 원하는 선언문을 검색하여 바로 붙여 넣을 수 있다.
image 

이보다 좀 더 나은 방식으로 간단한 애플리케이션 형태의  AppViewer가 존재하여 편리하게 원하는 API에 대한 선언문을 사용할 수 있다. 아래 그림에서 보듯이 다양한 언어, 심지어 delphi나 MASM에서 사용할 수 있는 기능까지 제공하고 있다.
 image image

자바에서도 이와 동일한 세 단계 방식의 호출 방법이 있는데, JNI (Java Native Interface)라고 부른다. System.loadLibrary()하여 dll을 메모리에 올리는 부분, 호출하고자 하는 메소드의 signature를 native라는 modifier를 써서 선언하는 부분(역시 이 메소드의 구현은 native하게 외부에 정의되어 있다고 선언하는 부분), 마지막으로 이 메소드를 호출하는 부분으로 구성된다. 자바가 호출하는 메소드를 C/C++에서 구현하기 위해서는 각 언어에 맞는 헤더파일이 필요한데 이를 위해 javah -jni 명령어를 써서 *.h 파일을 생성하며 이렇게 생성된 *.h를 C/C++에서 include하여 개발하는 과정을 거치게 된다.

2. COM 서버 접근 - RCW (Runtime-Callable Wrapper)를 이용하는 방법
COM 객체에 대한 wrapper를 만들어서 닷넷에서는 마치 일반적인 닷넷 객체를 호출하듯 프로그래밍할 수 있도록 지원하는 방법이다. Visual Studio에서 Add Reference기능을 클릭하며 아래에서 처럼 COM 컴포넌트를 선택할 수 있으며 OK를 누르는 순간 레퍼런스가 추가되면서 이 COM 컴포넌트에 대한 닷넷 Wrapper가 생성된다. 생성되는 wrapper는 Interop.xxx.dll의 어셈블리가 된다. 따라서 개발자는 닷넷 프로그래밍 하는 방식으로 COM 객체를 생성하고 호출할 수 있게 된다.
image
Visual Studio를 사용하지 않는 경우에는 .NET SDK에 들어있는 TlbImp.exe 명령어를 사용하여 wrapper를 생성할 수도 있다.
COM 객체가 대단히 크거나 복잡할 경우 생성되는 Wrapper의 크기 또한 부담스러우며, COM 내부에서 사용하기 위해 만든 인터페이스를 wrapper에서 숨길 수 있는 방안도 없기 때문에, 간편하게 생성하여 사용할 수 있는 장점이 있지만  COM 객체의 특성에 따라 이 방법이 적합한지 한번쯤은 생각해 볼 필요가 있다. 아울러 사용이 끝난 COM 객체는 해당 wrapper가  GCed될 때까지 살아 있기 때문에, wrapper가  Garbage Collector에 의해 GCed될 때까지 기다리지 말고 System.Runtime.InteropServices.Marshal.ReleaseComObject()를 이용하여 즉시 해제해주는 것이 좋다.

Posted by 장현춘 
posted by 방랑군 2009. 9. 8. 16:45

        private string AppConfigRead(string keyName)

        {

            string strReturn;

            Configuration currentConfig =

                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

 

            if (currentConfig.AppSettings.Settings.AllKeys.Contains(keyName))

                strReturn = currentConfig.AppSettings.Settings[keyName].Value;

            else

                strReturn = ""; //키가없으면.

 

            return strReturn;

        }

 

        private bool AppConfigWrite(string keyName, string value)

        {

            Configuration currentConfig =

                ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

 

            if (currentConfig.AppSettings.Settings.AllKeys.Contains(keyName)) //키가 있으면

                currentConfig.AppSettings.Settings[keyName].Value = value;

            else       //키가 없으면

                currentConfig.AppSettings.Settings.Add(keyName, value);

           

            currentConfig.Save();

            ConfigurationManager.RefreshSection("appSettings");   // 내용 갱신             

            return true;

        }

posted by 방랑군 2009. 9. 8. 10:47

출처 : http://www.hoons.kr/board.aspx?Name=cshaptip&Mode=2&BoardIdx=428&Key=&Value=

Constants

VK_LBUTTON (01)
Left mouse button

VK_RBUTTON (02)
Right mouse button

VK_CANCEL (03)
Control-break processing

VK_MBUTTON (04)
Middle mouse button (three-button mouse)

VK_XBUTTON1 (05)
Windows 2000/XP: X1 mouse button

VK_XBUTTON2 (06)
Windows 2000/XP: X2 mouse button

- (07)
Undefined

VK_BACK (08)
BACKSPACE key

VK_TAB (09)
TAB key

- (0A-0B)
Reserved

VK_CLEAR (0C)
CLEAR key

VK_RETURN (0D)
ENTER key

- (0E-0F)
Undefined

VK_SHIFT (10)
SHIFT key

VK_CONTROL (11)
CTRL key

VK_MENU (12)
ALT key

VK_PAUSE (13)
PAUSE key

VK_CAPITAL (14)
CAPS LOCK key

VK_KANA (15)
Input Method Editor (IME) Kana mode

VK_HANGUEL (15)
IME Hanguel mode (maintained for compatibility; use VK_HANGUL)

VK_HANGUL (15)
IME Hangul mode

- (16)
Undefined

VK_JUNJA (17)
IME Junja mode

VK_FINAL (18)
IME final mode

VK_HANJA (19)
IME Hanja mode

VK_KANJI (19)
IME Kanji mode

- (1A)
Undefined

VK_ESCAPE (1B)
ESC key

VK_CONVERT (1C)
IME convert

VK_NONCONVERT (1D)
IME nonconvert

VK_ACCEPT (1E)
IME accept

VK_MODECHANGE (1F)
IME mode change request

VK_SPACE (20)
SPACEBAR

VK_PRIOR (21)
PAGE UP key

VK_NEXT (22)
PAGE DOWN key

VK_END (23)
END key

VK_HOME (24)
HOME key

VK_LEFT (25)
LEFT ARROW key

VK_UP (26)
UP ARROW key

VK_RIGHT (27)
RIGHT ARROW key

VK_DOWN (28)
DOWN ARROW key

VK_SELECT (29)
SELECT key

VK_PRINT (2A)
PRINT key

VK_EXECUTE (2B)
EXECUTE key

VK_SNAPSHOT (2C)
PRINT SCREEN key

VK_INSERT (2D)
INS key

VK_DELETE (2E)
DEL key

VK_HELP (2F)
HELP key

 (30)
0 key

 (31)
1 key

 (32)
2 key

 (33)
3 key

 (34)
4 key

 (35)
5 key

 (36)
6 key

 (37)
7 key

 (38)
8 key

 (39)
9 key

- (3A-40)
Undefined

 (41)
A key

 (42)
B key

 (43)
C key

 (44)
D key

 (45)
E key

 (46)
F key

 (47)
G key

 (48)
H key

 (49)
I key

 (4A)
J key

 (4B)
K key

 (4C)
L key

 (4D)
M key

 (4E)
N key

 (4F)
O key

 (50)
P key

 (51)
Q key

 (52)
R key

 (53)
S key

 (54)
T key

 (55)
U key

 (56)
V key

 (57)
W key

 (58)
X key

 (59)
Y key

 (5A)
Z key

VK_LWIN (5B)
Left Windows key (Microsoft?Natural?keyboard)

VK_RWIN (5C)
Right Windows key (Natural keyboard)

VK_APPS (5D)
Applications key (Natural keyboard)

- (5E)
Reserved

VK_SLEEP (5F)
Computer Sleep key

VK_NUMPAD0 (60)
Numeric keypad 0 key

VK_NUMPAD1 (61)
Numeric keypad 1 key

VK_NUMPAD2 (62)
Numeric keypad 2 key

VK_NUMPAD3 (63)
Numeric keypad 3 key

VK_NUMPAD4 (64)
Numeric keypad 4 key

VK_NUMPAD5 (65)
Numeric keypad 5 key

VK_NUMPAD6 (66)
Numeric keypad 6 key

VK_NUMPAD7 (67)
Numeric keypad 7 key

VK_NUMPAD8 (68)
Numeric keypad 8 key

VK_NUMPAD9 (69)
Numeric keypad 9 key

VK_MULTIPLY (6A)
Multiply key

VK_ADD (6B)
Add key

VK_SEPARATOR (6C)
Separator key

VK_SUBTRACT (6D)
Subtract key

VK_DECIMAL (6E)
Decimal key

VK_DIVIDE (6F)
Divide key

VK_F1 (70)
F1 key

VK_F2 (71)
F2 key

VK_F3 (72)
F3 key

VK_F4 (73)
F4 key

VK_F5 (74)
F5 key

VK_F6 (75)
F6 key

VK_F7 (76)
F7 key

VK_F8 (77)
F8 key

VK_F9 (78)
F9 key

VK_F10 (79)
F10 key

VK_F11 (7A)
F11 key

VK_F12 (7B)
F12 key

VK_F13 (7C)
F13 key

VK_F14 (7D)
F14 key

VK_F15 (7E)
F15 key

VK_F16 (7F)
F16 key

VK_F17 (80H)
F17 key

VK_F18 (81H)
F18 key

VK_F19 (82H)
F19 key

VK_F20 (83H)
F20 key

VK_F21 (84H)
F21 key

VK_F22 (85H)
F22 key

VK_F23 (86H)
F23 key

VK_F24 (87H)
F24 key

- (88-8F)
Unassigned

VK_NUMLOCK (90)
NUM LOCK key

VK_SCROLL (91)
SCROLL LOCK key

 (92-96)
OEM specific

- (97-9F)
Unassigned

VK_LSHIFT (A0)
Left SHIFT key

VK_RSHIFT (A1)
Right SHIFT key

VK_LCONTROL (A2)
Left CONTROL key

VK_RCONTROL (A3)
Right CONTROL key

VK_LMENU (A4)
Left MENU key

VK_RMENU (A5)
Right MENU key

VK_BROWSER_BACK (A6)
Windows 2000/XP: Browser Back key

VK_BROWSER_FORWARD (A7)
Windows 2000/XP: Browser Forward key

VK_BROWSER_REFRESH (A8)
Windows 2000/XP: Browser Refresh key

VK_BROWSER_STOP (A9)
Windows 2000/XP: Browser Stop key

VK_BROWSER_SEARCH (AA)
Windows 2000/XP: Browser Search key

VK_BROWSER_FAVORITES (AB)
Windows 2000/XP: Browser Favorites key

VK_BROWSER_HOME (AC)
Windows 2000/XP: Browser Start and Home key

VK_VOLUME_MUTE (AD)
Windows 2000/XP: Volume Mute key

VK_VOLUME_DOWN (AE)
Windows 2000/XP: Volume Down key

VK_VOLUME_UP (AF)
Windows 2000/XP: Volume Up key

VK_MEDIA_NEXT_TRACK (B0)
Windows 2000/XP: Next Track key

VK_MEDIA_PREV_TRACK (B1)
Windows 2000/XP: Previous Track key

VK_MEDIA_STOP (B2)
Windows 2000/XP: Stop Media key

VK_MEDIA_PLAY_PAUSE (B3)
Windows 2000/XP: Play/Pause Media key

VK_LAUNCH_MAIL (B4)
Windows 2000/XP: Start Mail key

VK_LAUNCH_MEDIA_SELECT (B5)
Windows 2000/XP: Select Media key

VK_LAUNCH_APP1 (B6)
Windows 2000/XP: Start Application 1 key

VK_LAUNCH_APP2 (B7)
Windows 2000/XP: Start Application 2 key

- (B8-B9)
Reserved

VK_OEM_1 (BA)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the '''';:'''' key

VK_OEM_PLUS (BB)
Windows 2000/XP: For any country/region, the ''''+'''' key

VK_OEM_COMMA (BC)
Windows 2000/XP: For any country/region, the '''','''' key

VK_OEM_MINUS (BD)
Windows 2000/XP: For any country/region, the ''''-'''' key

VK_OEM_PERIOD (BE)
Windows 2000/XP: For any country/region, the ''''.'''' key

VK_OEM_2 (BF)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the ''''/?'''' key

VK_OEM_3 (C0)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the ''''`~'''' key

- (C1-D7)
Reserved

- (D8-DA)
Unassigned

VK_OEM_4 (DB)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the ''''[{'''' key

VK_OEM_5 (DC)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the ''''\|'''' key

VK_OEM_6 (DD)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the '''']}'''' key

VK_OEM_7 (DE)
Used for miscellaneous characters; it can vary by keyboard.

Windows 2000/XP: For the US standard keyboard, the ''''single-quote/double-quote'''' key

VK_OEM_8 (DF)
Used for miscellaneous characters; it can vary by keyboard.

- (E0)
Reserved

 (E1)
OEM specific

VK_OEM_102 (E2)
Windows 2000/XP: Either the angle bracket key or the backslash key on the RT 102-key keyboard

 (E3-E4)
OEM specific

VK_PROCESSKEY (E5)
Windows 95/98/Me, Windows NT 4.0, Windows 2000/XP: IME PROCESS key

 (E6)
OEM specific

VK_PACKET (E7)
Windows 2000/XP: Used to pass Unicode characters as if they were keystrokes. The VK_PACKET key is the low word of a 32-bit Virtual Key value used for non-keyboard input methods. For more information, see Remark in KEYBDINPUT, SendInput, WM_KEYDOWN, and WM_KEYUP

- (E8)
Unassigned

 (E9-F5)
OEM specific

VK_ATTN (F6)
Attn key

VK_CRSEL (F7)
CrSel key

VK_EXSEL (F8)
ExSel key

VK_EREOF (F9)
Erase EOF key

VK_PLAY (FA)
Play key

VK_ZOOM (FB)
Zoom key

VK_NONAME (FC)
Reserved for future use

VK_PA1 (FD)
PA1 key

VK_OEM_CLEAR (FE)
Clear key 
posted by 방랑군 2009. 9. 8. 10:36

Richard Ersek 및 Ken Jones

2개의 UI를 하나로

Microsoft의 1998 Professional Developer's Conference에서 COM+의 초기 테스트 버전이 소개되던 날 저녁에 우리는 당황한 한 프로그래머를 만났습니다. "도대체 Microsoft는 무슨 일을 하고 있습니까?" 그가 질문했습니다. "우리 일을 못하게 할 작정입니까?" 특히 6000명이 넘는 개발자를 대상으로 하는 4일간의 컨퍼런스에서 이 질문은 기묘하게 생각되었습니다. 사실은 아직도 의아하게 생각하고 있습니다. "왜 그렇게 말합니까?" "글쎄요," 그는 계속 말했습니다. "새 COM+ UI의 경우만 봐도 그래요. 시스템 관리자가 모든 일을 할 수 있기 때문에 우리와 같은 사람은 더 이상 필요 없게 될 것입니다."

우리는 그 신사에게 그의 직업은 안전하다고 설득했습니다. 사실 그는 Windows DNA 개발자였으며 아마 이전보다 더 가치 있는 일을 하고 있을 것입니다. 우리는 여러분과 같은 시스템 관리자에게도 똑같은 확신을 심어주기 위해 이 기사를 쓰게 되었습니다. 새 COM+ UI, 더 공식적으로 말하자면 구성 요소 서비스 관리 도구는 처음 보면 압도감을 느낄 수 있습니다. 구성 요소 수준 이하나 구성 요소의 인터페이스 및 메서드 수준 이상의 특성 설정을 포함하여 할 수 있는 일이 너무 많습니다.

그러나 구성 요소 서비스 관리 도구는 이중 기능을 고려할 때 그다지 위협적이지 않으며 휠씬 다양합니다. 시스템 관리자와 응용 프로그램 개발자가 함께 사용할 수 있는 UI로 설계되었습니다. 여기에서는 이 도구의 관리 기능을 소개하고 시스템 관리자가 이 도구를 사용하면 얼마나 편리한지 간단히 보여 주겠습니다. 이 기사는 개요를 다루기 때문에 자세한 과정은 소개하지 않고 개념만 설명하겠습니다. (이 과정에 대한 자세한 내용은 구성 요소 서비스 관리 도움말을 참고하십시오.)


현재 브라우저에서 인라인 프레임을 지원하지 않을 경우 여기를 누르면 별도의 페이지에서 볼 수 있습니다.

먼저 MTS와 COM+의 몇 가지 주요 변경부터 살펴보겠습니다. 이어서 가장 일반적인 다음 세 가지 관리 작업에 구성 요소 서비스 관리 도구를 어떻게 사용하는지 설명하겠습니다.

  • 응용 프로그램 구축
  • 역할 기반 보안 설정 및 응용 프로그램의 보안 식별
  • 최적의 시스템 성능을 위한 개체 풀링 관리

MTS에서 COM+로

많은 IIS 사용자가 이미 MTS(Microsoft Transaction Server)와 MTS의 UI인 MTS Explorer에 익숙해 있습니다. COM+는 Windows 2000 시스템에서 전통적인 COM과 MTS를 결합하는 서비스로 생각할 수 있습니다. COM+의 도입과 더불어 MTS의 기능이 운영 체제로 통합되어 왔습니다. 나중에 설명하겠지만 COM+는 MTS와 함께 사용할 수 있는 서비스를 확장하고 개선합니다.

MTS와 MTS Explorer를 사용하고 있는 사람은 구성 요소 서비스 관리 도구를 시작할 때 몇 가지 중요한 변경 사실을 발견할 것입니다. 특히 MTS 패키지를 이제는 COM+ 응용 프로그램으로 부릅니다.

COM 응용 프로그램의 개념이 전혀 새로운 것은 아닙니다. 단순히 함께 작업할 수 있도록 개발된 COM 구성 요소 그룹을 언급할 때 사용되는 용어입니다. 전통적인 COM 응용 프로그램에서는 구성 요소가 실행되기 전에 레지스트리에 항목을 구성하여 설치해야 합니다. 이 작업에는 대개 Regsvr32 유틸리티가 사용됩니다. COM+에서는 구성 요소를 COM+ 응용 프로그램으로 구성하면 이 과정이 자동으로 수행됩니다. COM 구성 요소는 Windows 2000에서 여전히 Regsvr32 유틸리티를 사용하여 등록할 수 있으며 COM+ 환경에서 구성되지 않은 구성 요소로 존재할 것입니다. 구성되지 않은 구성 요소는 구성 요소 서비스 관리 도구에 표시되지 않으며 새 COM+ 서비스를 사용하지 않습니다. 그럼에도 불구하고 이 구성 요소는 실행될 때 분산 COM+ 응용 프로그램 실행을 위해 제공되는 COM+ 인프라의 일부를 사용합니다.

COM+ 응용 프로그램은 하나 이상의 COM 구성 요소로 구성되어 있습니다. COM 클래스는 이름이 지정된 하나 이상의 구체적인 인터페이스입니다. 이 클래스는 메서드라고 하는 관련 함수 집합을 제공하는 클래스의 인터페이스를 표시합니다. COM 개체는 COM 클래스의 인스턴스입니다. COM 구성 요소는 COM 개체를 생성하는 이진 단위 코드이며 패키지 작성 및 등록 코드를 포함하고 있습니다.

compl02

COM 클래스는 CLSID(때로는 ProgID)에 의해 식별됩니다. 인터페이스는 규칙을 지정하는 관련 함수들의 그룹입니다. 여기에는 이름, 인터페이스 서명, 인터페이스 의미 및 마샬링 버퍼 형식이 포함됩니다.

인터페이스는 IID에 의해 식별됩니다. 인터페이스 구문은 IDL 및/또는 형식 라이브러리에서 정의됩니다. 클래스의 인터페이스는 관리할 수 있는 관련 메서드 집합으로 구분되어야 합니다. 인터페이스는 변경할 수 없다는 점에 유의하십시오. COM 규칙에는 인터페이스를 수정할 수 없다고 나와 있습니다. 메서드 추가와 같은 모든 수정은 새 인터페이스 정의가 필요합니다.

COM+ 응용 프로그램 구축

응용 프로그램 프로그래머는 COM+를 사용하여 구성 요소를 작성하고 이 구성 요소들을 응용 프로그램으로 통합하지만, 시스템 관리자의 업무는 대개 COM+ 응용 프로그램과 구성 요소를 설치, 구축, 구성하는 일입니다. 개발자는 부분적으로 구성된 COM+ 응용 프로그램을 시스템 관리자에게 전달합니다. 또는 외부에서 응용 프로그램이 제공되는 경우도 있습니다. 예를 들어, ISV(독립 소프트웨어 공급업체)로부터 COM+ 응용 프로그램을 구입할 수 있습니다. 그런 다음 관리자는 응용 프로그램을 특정 환경에 적합하게 적용합니다(예를 들어, 역할에 사용자 계정 추가 및 응용 프로그램 클러스터에 서버 이름 추가). 일반적인 관리 작업은 다음과 같습니다.

  • 관리 시스템에 부분적으로 구성된 COM+ 응용 프로그램 설치
  • 역할 구성원 및 개체 풀 크기 등의 특정 환경에 맞는 특성 제공
  • COM+ 응용 프로그램이 실행되는 ID(Windows 2000 사용자 계정) 설정
  • 완전한 구성의 COM+ 응용 프로그램 다시 내보내기
  • 응용 프로그램 프록시 생성(응용 프로그램을 원격으로 액세스하는 경우)

응용 프로그램이 특정 환경에 맞게 완전히 구성되면 관리자는 테스트 및/또는 제작 시스템에서 응용 프로그램을 구축할 수 있습니다. 여기에는 한 대 이상의 시스템에 완전한 구성의 COM+ 응용 프로그램을 설치하는 작업이 포함됩니다.

구성 요소 서비스 관리 도구는 도구에 포함된 응용 프로그램 내보내기 마법사를 사용하여 여러 서버에서 COM+ 응용 프로그램 구축을 편리하게 합니다. 구성 요소 서비스 관리 도구를 사용하면 COM+ 응용 프로그램 및 응용 프로그램 프록시의 설치 패키지를 생성할 수 있습니다. COM+는 Windows Installer 호환 설치 패키지를 생성합니다. 이 패키지에는 다른 시스템에 COM+ 응용 프로그램을 설치하는 데 필요한 모든 기능이 하나의 파일에 들어 있습니다.

compl03

COM+ 응용 프로그램을 포함하고 있는 .msi 파일은 COM+ 1.0 Services를 지원하는 컴퓨터에서만 설치할 수 있습니다(현재는 Windows 2000에서만 가능). 추가적인 장점으로 Windows Installer를 사용하여 설치한 COM+ 응용 프로그램은 Windows Installer 저작 도구를 사용하여 .msi 파일을 수정하지 않아도 프로그램 추가/제거 제어판에 나타납니다.

구성 요소 서비스 관리 도구에 의해 생성된 .msi 파일에는 다음과 같은 항목들이 포함됩니다.

  • COM+ 등록 정보를 가진 Windows Installer 테이블
  • 응용 프로그램의 특성을 포함하고 있는 .apl 파일
  • COM+ 응용 프로그램의 클래스에 의해 구현된 인터페이스를 나타내는 DLL 및 형식 라이브러리

.msi 파일과는 별도로 구성 요소 서비스 관리 도구는 캐비닛 파일(.cab)을 생성합니다. 이 파일은 Internet Explorer를 통해 COM+ 응용 프로그램을 구축할 수 있도록 .msi 파일을 효과적으로 포장합니다.

COM+ 응용 프로그램 프록시 설치

다른 (클라이언트) 컴퓨터에서 COM+ 서버 응용 프로그램을 원격으로 액세스하기 위해서는 클라이언트 컴퓨터가 DCOM 인터페이스 원격화에 필요한 프록시/스텁 DLL 및 형식 라이브러리를 포함하여 서버 응용 프로그램 특성의 하위 집합이 설치되어 있어야 합니다. 이 하위 집합을 응용 프로그램 프록시라고 합니다.

구성 요소 서비스 관리 도구를 통해 쉽게 COM+ 서버 응용 프로그램을 응용 프로그램 프록시로 내보낼 수 있습니다. COM+에 의해 생성되는 응용 프로그램 프록시는 표준 Windows Installer 설치 패키지입니다. 설치 후에 클라이언트 컴퓨터의 프로그램 추가/제거 제어판에 응용 프로그램 프록시가 나타납니다.

응용 프로그램 프록시를 생성할 때 COM+는 자동으로 다음과 같은 정보를 제공합니다. 이 정보는 응용 프로그램 프록시가 COM+ 서버 응용 프로그램을 원격으로 액세스하는 데 필요합니다.

  • 클래스 ID 정보(CLSID 및 ProgID). 응용 프로그램 프록시는 2개까지의 ProgID를 지원합니다.
  • 응용 프로그램 ID 및 응용 프로그램과 클래스의 관계(AppID)
  • 각 응용 프로그램의 위치 정보(원격 서버 이름)
  • 응용 프로그램에 의해 표시되는 모든 인터페이스의 마샬링 정보(예: 형식 라이브러리 및 프록시/스텁)
  • MSMQ 대기열 이름 및 ID(응용 프로그램에서 대기 중인 구성 요소 서비스를 사용할 수 있는 경우)
  • 역할 정보를 제외한 클래스, 인터페이스 및 특성
  • 응용 프로그램 특성

COM+ 서버 응용 프로그램과 달리 응용 프로그램 프록시는 DCOM 및 Windows Installer를 지원하는 모든 시스템에 설치할 수 있습니다. 다른 Windows 플랫폼의 클라이언트에서도 Windows 2000 서버에서 실행되는 COM+ 응용 프로그램을 액세스할 수 있습니다. Windows 2000을 실행하지 않아서 COM+가 부족한 컴퓨터에서는 DCOM 원격화에 필요한 정보의 하위 집합만 설치됩니다. 이 정보는 Windows 레지스트리에 설치됩니다. Windows 2000을 실행하지 않는 컴퓨터에 응용 프로그램 프록시(.msi 파일)를 설치하려면 해당 시스템에서 Windows Installer가 실행되고 있어야 합니다. Windows Installer는 Platform SDK의 일부처럼 재배포가 가능합니다.

COM+ 보안 설정

보안 역할은 COM+ 응용 프로그램의 액세스 제어 정책 모델을 만들고 실행합니다. 역할은 응용 프로그램의 리소스에 대한 액세스 허용 권한을 판별하기 위해 응용 프로그램에 대해 정의되는 사용자의 범주입니다. 개발자는 구성 요소, 인터페이스, 메서드 또는 개별 응용 프로그램 리소스를 포함한 역할을 상징적인 사용자 범주로서 응용 프로그램 및 이 응용 프로그램 내의 보다 세밀한 구조에 지정합니다. 이 역할 지정은 응용 프로그램에서 항목에 대한 액세스 권한을 가진 사용자 범주를 판별하는 데 사용됩니다.

응용 프로그램이 역할 기반 보안을 사용하면 응용 프로그램을 호출할 때마다 호출 프로그램의 역할 구성원을 검사합니다. 호출 프로그램이 호출된 항목에 대한 액세스 권한을 가진 역할에 속하지 않은 경우 호출이 실패합니다. 호출 프로그램은 역할에 정의된 제약 조건에 따라 응용 프로그램 및 리소스에 대한 액세스 권한을 엄격하게 승인합니다.

시스템 관리자의 업무는 Windows 2000 사용자 계정 및 그룹을 사용하는 응용 프로그램에 대해 정의된 역할을 채우는 것입니다. 이것은 응용 프로그램의 보안 정책을 수행하는 핵심 단계입니다. 사용자는 응용 프로그램을 통해 액세스할 데이터와 리소스에 대한 관계를 올바로 나타내는 역할을 지정해야 합니다.

사용자에게 역할을 채울 때 우선적으로 사용되는 방법은 Windows 2000 그룹을 사용하는 것입니다. 먼저 사용자 계정을 적절한 그룹에 지정한 다음 그룹이 적절한 역할에 지정되었는지 확인합니다. Windows 2000 그룹을 사용하여 역할을 채우면 많은 사용자를 관리하기가 쉬워집니다.

기업 컴퓨팅 환경에서는 대개 각 사용자의 위치를 효과적으로 추적하고 이것을 어떻게 각 응용 프로그램에 대해 특정한 역할 기반 보안 정책으로 매핑할지 결정하기가 어렵습니다. 사용자와 관리자 및 응용 프로그램의 수가 많아지면 이 작업은 점점 복잡해집니다. 가장 확장성 있는 해결책은 사용자 그룹을 COM+ 응용 프로그램 역할에 지정하는 것입니다.

역할에 그룹을 지정하기 전에 응용 프로그램의 보안 정책에 대해 확실히 이해할 필요가 있습니다. 이상적으로는 "관리자"나 "출납원"과 같이 역할에 포함할 사람을 제안하는 이름을 전달해야 합니다. 또한 어떤 종류의 사용자가 역할에 포함되어야 하는지 알 수 있도록 구성 요소 서비스 관리 도구를 사용하여 액세스할 수 있는 각 역할에 대한 설명이 있어야 합니다. 그러나 어떤 사용자 그룹이 어떤 역할에 속해야 하는지 확실히 모르는 경우에는 응용 프로그램과 함께 제공되는 설명서를 참조하거나 개발자에게 확인하십시오.

compl04

구성 요소 서비스 관리 도구를 사용하여 응용 프로그램을 설치하는 동안 역할에 초기 지정을 할 수 있고 응용 프로그램이 실행되는 동안 역할 구성원에 필요한 변경을 할 수도 있습니다.

개체 풀링

개체 풀링은 COM+에서 제공되는 자동 서비스이며, 구성 요소의 인스턴스가 풀에서 계속 활성 상태를 유지하면서 모든 클라이언트에서 필요한 구성 요소를 사용할 수 있도록 구성할 수 있습니다. 풀 크기 및 생성 요청 시간 제한 값과 같은 특성을 지정하여 주어진 구성 요소에 대해 풀이 유지되도록 구성하고 모니터할 수 있습니다. 일단 응용 프로그램이 실행되면 COM+는 풀을 관리하고 개체 동작의 세부 사항을 처리하고 지정한 기준에 따라 재사용합니다.

compl05

이러한 방법으로 개체를 재사용하면 특히 개체가 재사용의 장점을 충분히 활용하도록 작성된 경우 성능이 상당히 향상되고 확장성을 높일 수 있습니다. 개체 풀링을 통해 사용 가능한 하드웨어 리소스를 충분히 활용하도록 풀링을 구성할 수 있습니다. 사용 가능한 하드웨어 리소스가 변경되면 풀 구성이 변경될 수 있습니다. 또한 풀 관리를 통해 리소스 사용을 통제할 수 있습니다.

구성 요소가 풀링되도록 구성하면 COM+는 풀에서 구성 요소의 인스턴스를 유지하면서 클라이언트에서 구성 요소를 요구하는 경우에 활성화될 수 있습니다. 모든 개체 생성 요구는 풀 관리자를 통해 처리됩니다.

응용 프로그램이 시작되면 개체 생성에 성공한 동안 지정한 최소 수준까지 풀이 채워집니다. 구성 요소에 대한 클라이언트 요청이 시작되면 먼저 요청된 순서대로 풀로부터 처리됩니다. 풀링된 개체를 사용할 수 없고 아직 지정된 최대 수준으로 풀이 지정되지 않은 경우 클라이언트에 대해 새 개체가 생성되고 활성화됩니다.

풀이 최대 수준에 도달하면 클라이언트 요청이 대기열로 들어갑니다. 각 요청에 대해 풀에서 가장 먼저 사용할 수 있는 개체가 수신됩니다. 활성 개체와 비활성 개체의 수는 모두 최대 풀 값을 초과할 수 없습니다. 개체 생성 요청은 지정된 기간이 지난 후에 만료되므로 클라이언트가 개체 생성을 기다리는 시간을 조정할 수 있습니다. COM+는 풀이 최대 수준에 도달할 때까지 가능하면 클라이언트가 릴리스한 개체를 재사용하려고 시도합니다.

최대 풀 크기를 통해 사용할 리소스의 양을 세밀하게 제어할 수 있습니다. 예를 들어, 일정 수의 데이터베이스 연결에 대한 라이센스를 받은 경우 언제든지 몇 개의 연결을 열 지 제어할 수 있습니다.

클라이언트 사용 패턴, 개체 사용 특성 및 메모리와 연결과 같은 물리적 리소스를 고려하면 성능을 조율할 때 최적의 균형을 찾을 수 있습니다. 개체 풀링은 일정 시점이 지난 후에 반환이 줄어듭니다. 필요한 성능 수준과 이 성능을 얻기 위해 필요한 리소스 사이에서 균형점을 찾을 수 있습니다. 풀링을 통해 리소스 사용을 제어할 수 있습니다.

보다 간편한 COM+ 관리

이 내용이 새 구성 요소 서비스 관리 도구의 개요를 이해하는 데 도움이 될 수 있기를 바랍니다. 또한 도구 설계를 통해 원격 컴퓨터에서 COM+ 응용 프로그램을 더 쉽게 관리할 수 있는 방법을 올바로 이해할 수 있기를 바랍니다. 많은 질문과 의견 및 다음 기사에서 원하는 내용을 보내주시기 바랍니다.

COM+에 대해 더 자세히 알고 싶은 분들을 위한 풍부한 자료가 있습니다. 특히 아래의 서적들을 추천합니다. 이 서적들은 주로 개발자를 대상으로 하고 있지만 시스템 관리자에게도 많은 도움이 됩니다. 

posted by 방랑군 2009. 9. 8. 10:26

HOW TO: Set a Windows Hook in Visual C# .NET

적용 대상
This article was previously published under Q318804

SUMMARY

This article describes how to set a hook that is specific to a thread and to a hook procedure by using the mouse hook as an example. You can use hooks to monitor certain types of events. You can associate these events with a specific thread or with all of the threads in the same desktop as a calling thread.

back to the top

Set a Mouse Hook

To set a hook, call the SetWindowsHookEx function from the User32.dll file. This function installs an application-defined hook procedure in the hook chain that is associated with the hook.

To set a mouse hook and to monitor the mouse events, follow these steps:
  1. Start Microsoft Visual Studio .NET.
  2. On the File menu, point to New, and then click Project.
  3. In the New Project dialog box, click Visual C# Projects under Project Types, and then click Windows Application under Templates. In the Name box, type ThreadSpecificMouseHook. Form1 is added to the project by default.
  4. Add the following line of code in the Form1.cs file after the other using statements:
    using System.Runtime.InteropServices;
    					
  5. Add following code in the Form1 class:
    public delegate int HookProc(int nCode, IntPtr wParam, IntPtr lParam);
    
    //Declare hook handle as int.
    static int hHook = 0;
    
    //Declare mouse hook constant.
    //For other hook types, you can obtain these values from Winuser.h in Microsoft SDK.
    public const int WH_MOUSE = 7;
    private System.Windows.Forms.Button button1;
    
    //Declare MouseHookProcedure as HookProc type.
    HookProc MouseHookProcedure;			
    
    //Declare wrapper managed POINT class.
    [StructLayout(LayoutKind.Sequential)]
    public class POINT 
    {
    	public int x;
    	public int y;
    }
    
    //Declare wrapper managed MouseHookStruct class.
    [StructLayout(LayoutKind.Sequential)]
    public class MouseHookStruct 
    {
    	public POINT pt;
    	public int hwnd;
    	public int wHitTestCode;
    	public int dwExtraInfo;
    }
    
    //Import for SetWindowsHookEx function.
    //Use this function to install thread-specific hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
     CallingConvention=CallingConvention.StdCall)]
    public static extern int SetWindowsHookEx(int idHook, HookProc lpfn, 
    IntPtr hInstance, int threadId);
    
    //Import for UnhookWindowsHookEx.
    //Call this function to uninstall the hook.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
     CallingConvention=CallingConvention.StdCall)]
    public static extern bool UnhookWindowsHookEx(int idHook);
    		
    //Import for CallNextHookEx.
    //Use this function to pass the hook information to next hook procedure in chain.
    [DllImport("user32.dll",CharSet=CharSet.Auto,
     CallingConvention=CallingConvention.StdCall)]
    public static extern int CallNextHookEx(int idHook, int nCode, 
    IntPtr wParam, IntPtr lParam);  
    					
  6. Add a Button control to the form, and then add the following code in the Button1_click procedure:
    private void button1_Click(object sender, System.EventArgs e)
    {
    	if(hHook == 0)
    	{
    	        // Create an instance of HookProc.
    		MouseHookProcedure = new HookProc(Form1.MouseHookProc);
    				
    		hHook = SetWindowsHookEx(WH_MOUSE, 
    					MouseHookProcedure, 
    					(IntPtr)0,
    					AppDomain.GetCurrentThreadId());
    		//If SetWindowsHookEx fails.
    		if(hHook == 0 )
    		{
    			MessageBox.Show("SetWindowsHookEx Failed");
    			return;
    		}
    		button1.Text = "UnHook Windows Hook";
    	}
    	else
    	{
    		bool ret = UnhookWindowsHookEx(hHook);
    		//If UnhookWindowsHookEx fails.
    		if(ret == false )
    		{
    			MessageBox.Show("UnhookWindowsHookEx Failed");
    			return;
    		}
    		hHook = 0;
    		button1.Text = "Set Windows Hook";
    		this.Text = "Mouse Hook";
    	} 
    }
    					
  7. Add the following code for the MouseHookProc function in the Form1 class:
    public static int MouseHookProc(int nCode, IntPtr wParam, IntPtr lParam)
    {
    	//Marshall the data from callback.
    	MouseHookStruct MyMouseHookStruct = (MouseHookStruct) Marshal.PtrToStructure(lParam, typeof(MouseHookStruct));
    
    	if (nCode < 0)
    	{
    		return CallNextHookEx(hHook, nCode, wParam, lParam);
    	}
    	else
    	{
    		//Create a string variable with shows current mouse. coordinates
    		String strCaption = "x = " + 
    				MyMouseHookStruct.pt.x.ToString("d") + 
    					"  y = " + 
    		MyMouseHookStruct.pt.y.ToString("d");
    		//Need to get the active form because it is a static function.
    		Form tempForm = Form.ActiveForm;
            
    		//Set the caption of the form.
    		tempForm.Text = strCaption;
    		return CallNextHookEx(hHook, nCode, wParam, lParam); 
    	}
    }
    					
  8. Press F5 to run the project, and then click the button on the form to set the hook. The mouse coordinates appear on the form caption bar when the pointer moves on the form. Click the button again to remove the hook.
back to the top

Global Hook Is Not Supported in .NET Framework

You cannot implement global hooks in Microsoft .NET Framework. To install a global hook, a hook must have a native dynamic-link library (DLL) export to inject itself in another process that requires a valid, consistent function to call into. This requires a DLL export, which .NET Framework does not support. Managed code has no concept of a consistent value for a function pointer because these function pointers are proxies that are built dynamically.

back to the top

REFERENCES

For more information about windows hooks, see the following MSDN documentation:

About Hooks
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/hooks_9rg3.asp

back to the top