FFmpeg : http://ffmpeg.mplayerhq.hu/
Unofficial FFmpeg Win32 Builds :  http://arrozcru.no-ip.org/ffmpeg_builds/


flv 변환예제
ffmpeg.exe  -y -i input.wmv -ar 22050 -qmax 10 output.flv

-ar rate            set audio sampling rate (in Hz)
-qmax              <int>   E.V.. max video quantizer scale (VBR)


이미지 추출 예제
ffmpeg.exe -y -i "%1" -ss 0:0:10.0 -vframes 1 -vcodec png -y -f image2 "%1.png"

-ss time_off        set the start time offset
-vframes number     set the number of video frames to record
-vcodec codec       force video codec ('copy' to copy stream)


'Dev > Windows' 카테고리의 다른 글

유니코드(UNICODE), C++  (0) 2008.10.16
VARIANT 에서 객체 추출하기  (0) 2008.09.09
벤치마킹  (0) 2007.10.17
달라진 기능 (IIS 6.0)  (0) 2007.09.28
SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20

- 1초동안 실행한 횟수

- 함수
  Add : 두수 더하기
  AddData : DB에 데이터 Insert

- 절대적인 숫자의 크기는 의미없음 (상대적인 수치만 보기)


COM+ 벤치마킹

  서버 응용프로그램
클라이언트 언어 호출방법 Add AddData
VC++
(MFC)
ATL/C++, COM+ Custom 10277 381
ATL/C++, COM+ Dispatch 3838 346
C#, COM+ Dispatch 1521 373
C# (WinApp) C#, COM+   1410 384


  라이브러리 응용프로그램
클라이언트 언어 호출방법 Add AddData
VC++
(MFC)
ATL/C++, COM+ Custom 36757 67
ATL/C++, COM+ Dispatch 15895 65
C#, COM+ Dispatch 2021 411
C# (WinApp) C#, COM+   4177 511


  일반 라이브러리 
C# (WinApp) C#, Library     639
VC++ (MFC) VC++, DLL     916



ATL COM+ (VC++)

- Unmanaged (Native) Custom 인터페이스로 호출시 호출성능은 가장 좋음

- 라이브러리 응용프로그램 패키지에서 호출성능은 가장 좋으나

  AddData 의 경우 DB 풀링이 안되는거 같아 성능 저하 현상

- .Net 클라이언트 프로그램에서 호출했을 경우도 Iterop 에 의한 성능저하 별로 없음


: 서버 응용프로그램 패키지에서 실행 권장

: 어플리케이션 프로그램이 아닌 웹환경에서는 대세 



C# COM+ (.Net Enterprise Service)

- Unmanaged (Native) 코드보다는 호출성능은 떨어짐

- 그러나 DB업무인 AddData의 경우 Unmanaged 코드랑 성능차이 없음

- AddData 의 경우 라이브러리 응용프로그램 패키지에서 성능 향상   

  (ATL COM+ 와 대조적인 결과, DB풀링을 드라이버차원이 아닌 .Net 어셈블리에서 처리하는것 같음)

- Unmanaged 클라이언트 프로그램에서 호출했을 경우 Iterop에 의한 약간의 성능 저하

- Managed (.Net)에서 호출시 가장 좋은 성능을 보임

- DTC를 사용하지 않을경우 .Net Library 를 사용하는것이 COM+를 이용하는것 보다 성능이 좋음


: 라이브러리 응용프로그램 패키지에서 실행 권장

: COM+ DTC를 이용하지 않을시는 .Net Library 권장








DCOM & RDS


- 인터페이스
    DCOM(Proxy) - 컴포넌트 내보내기/설치하기 Custom 인터페이스 사용
    DCOM(RDS.Dataspace) - RDS.Dataspace 이용 하여 Dispatch 인터페이스 사용
    RDS - RDS.Dataspace

  Add AddData
DCOM(Proxy) 596 200
DCOM(RDS.Dataspace) 295 146
RDS 42 38


'Dev > Windows' 카테고리의 다른 글

VARIANT 에서 객체 추출하기  (0) 2008.09.09
ffmpeg  (0) 2008.04.09
달라진 기능 (IIS 6.0)  (0) 2007.09.28
SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
COM+ Queued Components  (0) 2007.08.09

달라진 기능 (IIS 6.0)

IIS 4.0, IIS 5.0, IIS 5.1 및 IIS 6.0의 기본 동작과 설정에는 몇 가지 중요한 차이점이 있습니다.

이 항목에서는 다음 정보를 설명합니다.

핵심 기능 및 서비스

메타베이스 구성

관리

프로그래밍을 이용한 관리

ASP(Active Server Pages)

ASP 정체 감지

보안

성능

IIS 유틸리티 구성 요소

64비트 버전의 Windows Server 2003 제품군에서의 IIS


다음 표에는 IIS 버전 간의 중요한 차이점이 요약되어 있습니다.

 * IIS 4.0 IIS 5.0 IIS 5.1 IIS 6.0

플랫폼

Windows NT 4.0

Windows 2000

Windows XP Professional

Windows Server 2003 제품군

아키텍처

32비트

32비트

32비트 및 64비트

32비트 및 64비트

응용 프로그램 프로세스 모델

TCP/IP 커널

MTX.exe

TCP/IP 커널

DLLhost.exe(중급 또는 고급 응용 프로그램 격리에서의 다양한 DLL 호스트)

TCP/IP 커널

DLLhost.exe(중급 또는 고급 응용 프로그램 격리에서의 다양한 DLL 호스트)

HTTP.sys 커널

IIS 5.0 격리 모드에서 IIS를 실행할 경우: Inetinfo.exe(In-process 응용 프로그램의 경우) 또는 DLLhost.exe(Out-of-process 응용 프로그램의 경우)

Worker Process Isolation Mode에서 IIS를 실행할 경우: W3wp.exe(여러 개의 작업자 프로세스)

메타베이스 구성

이진

이진

이진

XML

보안

Windows 인증

SSL

Windows 인증

SSL

Kerberos

Windows 인증

SSL

Kerberos

보안 마법사

Windows 인증

SSL

Kerberos

보안 마법사

Passport 지원

원격 관리

HTMLA

HTMLA

HTMLA 없음

터미널 서비스

원격 관리 도구(HTML)

터미널 서비스

클러스터 지원

Windows NT 4.0 사용

IIS 클러스터링

Windows 지원

Windows 지원

WWW 서비스

Windows NT 4.0의 IIS

Windows 9x의 개인 웹 관리자

Windows 2000의 IIS

Windows XP Professional의 IIS(선택 사항)

Windows Server 2003 제품군 구성원의 IIS


핵심 기능 및 서비스

IIS 6.0은 기본 Windows 커널인 HTTP.sys를 사용할 수 있도록 재설계되었습니다. 이로 인해 기본 제공된 응답/요청 캐시와 큐를 사용할 수 있으며 응용 프로그램 프로세스 요청을 작업 프로세스들로 직접 전달하여 안정성과 성능을 개선했습니다.

IIS 6.0에는 응용 프로그램 환경 구성을 위한 두 가지 작업 모드인 작업자 프로세스 격리 모드와 IIS 5.0 격리 모드가 도입되었습니다. IIS 6.0을 설치할 때 기본으로 지정되는 격리 모드는 새로 설치할 것인지, 아니면 기존 설치된 것에서 업그레이드할 것인지에 따라 다릅니다.

IIS 6.0을 새로 설치하면 IIS는 작업자 프로세스 격리 모드에서 실행됩니다.

이전 버전의 IIS 6.0에서 업그레이드하면 격리 모드는 이전에 설치한 IIS 6.0의 구성을 그대로 유지합니다.

IIS 5.0 또는 IIS 4.0에서 업그레이드하면 IIS 6.0은 기존 응용 프로그램과의 호환성을 유지하기 위해서 기본적으로 IIS 5.0 격리 모드에서 실행됩니다.

격리 모드 간 전환에 대한 자세한 내용은 격리 모드 구성을 참조하십시오.

IIS 5.0 격리 모드

IIS 5.0 격리 모드에서는 IIS 5.0의 프로세스 관리 방식과 비슷하게 응용 프로그램 프로세스가 관리됩니다. 즉 모든 in-process 응용 프로그램이 Inetinfo.exe에서 실행되고 out-of-process 응용 프로그램은 별도의 DLL 호스트에서 실행됩니다. 기존의 몇몇 응용 프로그램들은 동시에 실행되거나 응용 프로그램과 별도로 세션 상태를 저장하는 것을 고려하지 않고 설계되었을 수 있습니다. 그러므로 IIS 5.0 격리 모드에서의 프로세스 실행은 대부분의 기존 응용 프로그램과의 호환성을 보증할 수 있습니다. 다음 그림은 IIS 5.0 격리 모드에서 응용 프로그램 프로세스가 처리되는 방법을 보여 줍니다.

IIS6 Core arc_ 2c graphic

작업자 프로세스 격리 모드

작업자 프로세스 격리 모드의 경우 모든 응용 프로그램 코드가 격리된 환경에서 실행됩니다. 따라서 기존에 발생하던 병목 현상이 일부 사라졌습니다. 작업자 프로세스 격리 모드를 사용하여 개개의 웹 응용 프로그램의 기능을 독립적인 작업자 프로세스를 사용하는 여러 개의 사이트에 격리할 수 있습니다. 이렇게 하면 한 응용 프로그램이나 사이트로 인해 다른 응용 프로그램이나 사이트가 중지되지 않습니다. 또한 응용 프로그램이나 사이트를 자체 프로세스 공간으로 분리하면 다시 시작(시스템에서 실행되는 다른 모든 사이트나 응용 프로그램과 관계없이), 응용 프로그램에 사용되는 구성 요소 변경, 디버깅, 카운터 모니터링, 리소스 조절 등의 관리 작업이 줄어듭니다. 다음 그림은 IIS 작업자 프로세스 격리 모드로 설정된 IIS가 응용 프로그램을 관리하는 방법을 보여 줍니다.

IIS6 core arc 01c graphic

HTTP 요청은 올바른 응용 프로그램 풀의 큐로 전달되는데, 이는 응용 프로그램 풀 기능을 수행하는 사용자 모드 작업자 프로세스가 커널로부터 요청을 직접 가져오며 out-of-process DLL 호스트로 요청을 보낼 때 발생하는 필요 없는 프로세스 홉을 제거한다는 의미입니다. IIS 6.0에는 더 이상 in-process 응용 프로그램이라는 개념이 사용되지 않습니다. ISAPI 확장 지원과 같은 모든 필수 HTTP 응용 프로그램 런타임 서비스는 모두 응용 프로그램 풀에서 똑같이 사용할 수 있습니다. 이 설계는 컴퓨터의 다른 프로세스에서 처리되는 다른 HTTP 응용 프로그램 또는 다른 웹 사이트의 중단으로 인해 HTTP 응용 프로그램이나 웹 사이트가 중단되는 것을 방지해 줍니다. 격리된 응용 프로그램 프로세스를 사용하면 필요할 경우 다른 콘텐트나 다른 프로세스의 응용 프로그램에 영향을 주지 않고 프로세스를 종료하여 모든 리소스를 언로드할 수 있으므로 구성 요소를 언로드하는 것이 더 쉽습니다. 또한 응용 프로그램 풀마다 프로세스 수준에서 사용할 수 있는 다른 운영 체제 서비스(예: CPU 조절)를 활용할 수 있어 도움이 됩니다.

뿐만 아니라 World Wide Web 게시 서비스(WWW 서비스)의 전체적인 기능을 유지하는 작업자 프로세스 격리 모드의 중요한 부분은 완전히 작업자 프로세스의 외부에서 실행됩니다. Windows에 사용되는 범용 HTTP 프로세서인 IIS 6.0 커널 모드 드라이버 HTTP.sys와 WWW 서비스 관리 및 모니터링 구성 요소는 핵심 웹 서버의 핵심적인 부분을 격리합니다. 두 구성 요소 모두 보호되므로 이들 구성 요소에 타사 코드를 로드할 수 없습니다. 따라서 오류가 있는 HTTP 응용 프로그램이 서버의 WWW 서비스를 방해하지 않습니다.

격리 모드에 대한 자세한 내용은 Application Isolation Modes를 참조하십시오.

메타베이스 구성

IIS 6.0의 메타베이스는 이전 버전의 IIS와 달리 이진 형식이 아니라 XML 파일로 저장됩니다. 위치는 동일하지만 업데이트, 롤백, 복원, 확장 등의 조작 방법은 변경되었습니다. 하나가 아닌 두 개의 MetaBase.xml과 MBSchema.xml이 핵심입니다.

관리

IIS 4.0에서는 응용 프로그램이 인터넷 서비스와 같은 프로세스나 별도의 프로세스에서 실행될 수 있습니다. IIS 5.0과 5.1에서는 성능 및 확장성 향상을 위해 응용 프로그램을 합동 프로세스로 그룹화할 수 있습니다. 자세한 내용은 응용 프로그램 구성를 참조하십시오. IIS 6.0 작업자 프로세스 격리 모드에서는 여러 개의 응용 프로그램 풀로 응용 프로그램을 그룹화할 수 있습니다.

응용 프로그램 매핑 속성 시트에는 특정 파일 형식에 매핑된 응용 프로그램에서 처리하는 HTTP(Hypertext Transport Protocol) verb 목록이 들어 있습니다. 이 verb 목록은 IIS 4.0에서 변경된 것입니다. IIS 4.0의 경우 제외되거나 처리되지 않는 verb가 목록에 포함되어 있습니다. 프로토콜에 새로 추가되는 HTTP verb를 수용하기 위해 이러한 변경이 이루어졌습니다. 응용 프로그램 매핑에 대한 자세한 내용은 IIS 6.0의 응용 프로그램 매핑 설정을 참조하십시오.

클러스터링은 IIS 6.0의 기능이 아닙니다. IISsynche.exe가 지원되지 않습니다. 클러스터링은 Windows Server 2003 제품군 기능입니다. Windows 클러스터링(MSCS)에 대한 자세한 내용은 Windows Server 2003 제품군 도움말을 참조하십시오.

IIS 5.0에서는 IIS 4.0의 사용자 지정 파일 위치가 변경되었습니다.

웹 기반 인터넷 서비스 관리자(HTML)가 원격 관리(HTML) 도구라고 하는 웹 응용 프로그램으로 대체되었습니다. 원격 관리(HTML) 도구를 사용하여 IIS를 원격으로 관리하려면 IIS 6.0에서 원격으로 서버 관리를 참조하십시오.

프로그래밍을 이용한 관리

이전 버전의 IIS에서는 컴파일된 C++ 응용 프로그램에서 ABO(관리 기본 개체)를 사용하거나, C++ 또는 스크립트 파일에서 ADSI(Active Directory 서비스 인터페이스)를 사용하여 IIS를 프로그래밍 방식으로 관리할 수 있었습니다. IIS 6.0에는 관리자가 프로그래밍 방식으로 모든 서비스와 응용 프로그램을 제어할 수 있는 기술인 WMI(Windows Management Instrumentation) 공급자가 포함되어 있습니다. WMI에 대한 자세한 내용은 MSDN에서 IIS SDK(Software Development Kit)의 "IIS Administration Technologies"를 참조하십시오.

Active Server Pages

IIS 6.0에서는 Microsoft ASP(Active Server Pages)와 Microsoft ASP.NET을 함께 사용할 수 있습니다. ASP.NET 응용 프로그램을 실행하기 위한 IIS 구성에 대한 자세한 내용은 ASP.NET 정보를 참조하십시오. IIS 6.0에서 변경된 새로운 ASP 기능은 ASP의 중요 변경 사항을 참조하십시오.

작업자 프로세스(W3wp.exe)가 IIS 6.0 작업자 프로세스 격리 모드에서 네트워크 서비스 계정으로 실행되기 때문에 스크립트 디버거 및 Visual InterDev에 ASP 디버깅을 사용하려면 시작 권한 및 액세스 권한을 구성해야 합니다. 자세한 내용은 ASP 디버깅 사용을 참조하십시오.

ASP 정체 감지

IIS 웹 사이트의 사용량이 많을 경우 순간적으로 허용할 수 있는 최대 ASP 스레드 수에 도달하게 되면 몇몇 ASP 스레드가 정체되어 성능이 저하될 수 있습니다. IIS 6.0에는 ASP ISAPI 확장인 ASP.dll의 특정 인스턴스를 호스트하는 작업자 프로세스를 재생하여 스레드 중단 문제를 해결할 수 있는 기능이 있습니다. IIS 6.0에서 ASP 스레드가 중단되면 ASP.dll이 ISAPI 서버 지원 함수인 HSE_REQ_REPORT_UNHEALTHY를 호출하고 WWW 서비스는 ASP.dll을 호스트하는 작업자 프로세스를 재생하여 이벤트 로그에 항목을 만듭니다.

ISAPI 서버 지원 함수에 대한 자세한 내용은 MSDN® Online의 ISAPI 확장 참조에서 ServerSupportFunction을 참조하십시오.

보안

IIS 6.0의 중요한 변경 사항 중 하나로 웹 서버 보안을 들 수 있습니다. 악의적인 사용자의 침입을 예방하기 위해 Microsoft Windows Server 2003 제품군의 구성원에서는 IIS가 기본적으로 설치되지 않습니다.

  중요:

공격 대상이 될 수 있는 서버의 취약점을 최소화하기 위해 IIS 6.0은 Windows Server 2003에 기본적으로 설치되지 않습니다. IIS 6.0을 처음 설치할 때 이 서비스는 잠겨 있습니다. 즉, 정적 웹 페이지에 대한 요청 처리만 사용 가능하며 World Wide Web 게시 서비스(WWW 서비스)만 설치됩니다. ASP, ASP.NET, CGI 스크립팅, Microsoft의 FrontPage® 2002 Server Extensions 및 WebDAV 게시 등 IIS를 기반으로 하는 기능은 아무것도 설정되지 않습니다. 이러한 기능을 사용하지 않으면 IIS에서 404 오류가 반환됩니다. IIS 관리자에서 웹 서비스 확장 노드를 통해 이러한 기능을 사용하도록 설정할 수 있습니다. 404 오류와 그 밖의 문제를 해결하는 방법에 대한 자세한 내용은 IIS 6.0에서 문제 해결을 참조하십시오.

웹 서버 인증서 마법사와 CTL 마법사를 사용하여 웹 및 NTFS 보안 설정을 동기화하고, 서버 인증서를 받아 설치하며, 인증서 신뢰 목록을 만들고 수정할 수 있습니다. 또한 CSP(암호화 서비스 공급자)를 선택하여 인증서로 데이터를 암호화할 수도 있습니다.

IIS 6.0의 기타 보안 변경 내용은 다음과 같습니다.

업그레이드 시 사용 안 함: 다음 중 하나의 조건이 만족하지 않을 경우 World Wide Web 게시 서비스(WWW 서비스)는 Windows Server 2003 제품군 업그레이드 시에 사용 안 함으로 설정됩니다.

업그레이드를 실행하기 전에 Windows 2000 Server에 IIS 잠금 마법사가 이미 실행된 경우입니다. IIS 잠금 마법사는 불필요한 기능을 사용 중지하여 외부 공격을 줄이고 사이트에서 사용할 기능을 사용자가 결정할 수 있게 합니다. IIS 잠금 마법사는 IIS Lockdown Tool에서 사용할 수 있습니다.

  중요:

WWW 서비스를 사용하는 경우 제품을 Windows Server 2003 제품군으로 업그레이드하기 전에 먼저 Windows 2000 Server에 IIS 잠금 마법사를 실행하는 것이 좋습니다. IIS 잠금 마법사는 Windows 2000 Server를 설치할 때 나타나는 기능 중 필요 없는 기능을 사용 중지하거나 제거하여 컴퓨터 보안 유지를 돕습니다. 이렇게 하지 않으면 이런 기능은 업그레이드 후 시스템에 남아 서버가 공격에 취약해집니다.

그룹 정책을 통해 IIS 사용 안 함: Windows Server 2003 제품군에서는 사용자가 컴퓨터에 IIS를 설치하지 못하도록 도메인 관리자가 제한할 수 있습니다.

액세스 권한 수준이 낮은 계정으로 실행: IIS 작업자 프로세스가 액세스 권한이 적은 사용자 컨텍스트에서 실행되도록 합니다. 그러면 공격 받을 가능성이 대폭 줄어듭니다.

ASP 보안: 기본으로 제공된 모든 ASP 함수가 항상 액세스 권한이 매우 낮은 IUSR_computername 계정으로 실행되도록 합니다.

실행 파일 실행 제한: 일반적으로 시스템 폴더에 있는 cmd.exe와 같은 실행 파일을 실행하려면 Administrators 그룹, LocalSystem, Interactive 또는 Service 계정의 구성원이어야 합니다. 이 제한을 사용하면 Administrators에 대한 원격 액세스가 제한되어 익명 사용자는 실행 파일을 실행할 수 없습니다.

패치 관리: 패치 관리를 사용하면 관리자가 서비스를 중단하지 않고도 최신 보안 패치를 설치할 수 있습니다.

알려진 확장명: IIS에서 알려진 확장명의 파일만 요청을 처리하도록 합니다. 파일 확장명이 알려지지 않은 파일 형식이나 서비스에서 해당 파일 형식을 요청하는 응용 프로그램에 매핑되는 경우 서버가 콘텐트 요청을 거부합니다.

  참고:

확장은 동적 콘텐트를 제공하는 페이지(예: .asp 또는 .aspx)를 사용하는 웹 서비스 확장을 의미하며 확장명은 .exe, .txt, .inc 등과 같은 파일 형식을 나타냅니다.

성능

ASP 페이지에 할당할 메모리 양을 제한하기 위해 AspScriptFileCacheSize 메타베이스 속성 기본값은 250개의 ASP 페이지로 설정되고, AspScriptEngineCacheMax 메타베이스 속성 기본값은 125개의 스크립트 엔진으로 설정되었습니다. 자주 요청되는 ASP 페이지 수가 많은 사이트에서는 ASPScriptFileCacheSize를 더 높게 설정할 수 있습니다. 그러면 캐시에서 페이지를 검색하는 것이 ASP 페이지를 컴파일하는 것보다 훨씬 빠르기 때문에 성능이 향상됩니다. 자주 요청되는 ASP 페이지 수가 적은 사이트의 경우 이 값을 낮게 설정하여 메모리를 절약할 수 있습니다.

IIS 유틸리티 구성 요소

CDONTS: CDONTS(Collaboration Data Objects for Windows NT Server)가 Windows Server 2003 제품군에서 제거되었습니다. 웹 응용 프로그램에서 CDONTS를 사용할 경우 Microsoft CDO(Collaboration Data Objects)로 변환할 수 있습니다. 대부분의 CDONTS 메서드는 CDO의 메서드와 일치하지만 이름이 다를 수 있습니다. PSDK(Platform Software Developer Kit)에 있는 DCO 참고 자료를 보려면 MSDN Online의 Overview of CDO를 참조하십시오.

IIS 유틸리티 구성 요소 설치 안 함: Ad Rotator, Browser Capabilities, Content Linker, Content Rotator, Counters, Logging Utility, My Info, Page Counter, Status 도구는 IIS 6.0과 함께 설치되지 않습니다. 그러나 이전 버전의 IIS에서 웹 서버를 업그레이드할 경우 이들 유틸리티 구성 요소가 제거되지는 않습니다.

64비트 Windows Server 2003 제품군에서의 IIS

64비트 버전 Windows Server 2003 제품군이 설치된 운영 체제에서는 IIS가 64비트 응용 프로그램으로 실행됩니다. 즉 64비트 버전 Windows Server 2003 제품군에서는 32비트 응용 프로그램을 호출할 수 없습니다. 예를 들어 Jet 데이터베이스 엔진이 64비트 응용 프로그램으로 변환되지 않으므로 ADO(ActiveX® Data Objects)를 사용하여 ASP 페이지의 Microsoft Access 데이터베이스를 열 수 없습니다. 그러나 ADO를 사용하여 SQL이나 Exchange 같은 다른 드라이버에 계속 액세스할 수 있습니다.


©2007 Microsoft Corporation. All rights reserved.  사용약관 | 상표 | 개인정보보호 | 법적정보
 Microsoft

'Dev > Windows' 카테고리의 다른 글

ffmpeg  (0) 2008.04.09
벤치마킹  (0) 2007.10.17
SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
COM+ Queued Components  (0) 2007.08.09
SWC (Services Without Components)  (0) 2007.08.08
 
SQLOLEDB의 경우 SQLOLEDB의 버그인지는 모르겠지만
Select 의 결과 뿐만 아니라 Print문 혹은 Update나 Delete 에 의한 영향받은 레코드의 개수가
각각 1개의 커서로 인식해 Recordset 이 생성됩니다.
 
 
--************************************
ALTER Procedure Proc_Test
As
 
Print '123'                       -- (1)
Update tbl Set a = 1              -- (2)
Select 'Second' As Result         -- (3)
--************************************
 
위의 프로시저의 경우 MSDASQL Provider로 실행된 결과는 레코드셋이 1개가 생성되고
(3)의 결과만 나타납니다.
 
허나 SQLOLEDB Provider로 실행할 경우 (1), (2)의 결과도 하나의 레코드셋으로 인식을해서
레코드셋이 3개가 생성되고 NextRecordset 메쏘드를 2번더 호출해야 (3)의 결과가 나옵니다.
 
그래서 그 해결 방법이 set nocount on 을 실행하여 (1), (2)의 결과를 없애야 비로서
MSDASQL Provider처럼 동작을 합니다.
 
이 이상한 결과는 버그인지, 의도된 동작인지는 모르겠지만..
(버그라고 추측이..)
 
ADO의 SQLOLEDB Provider에서만 나타나고..
ADO.NET의 System.Data.SqlClient 나 System.Data.OleDb(Provider=SQLOLEDB) 에서는 나타나지 않습니다.
 
 
ps.
이와 비슷한 내용의 KB을 찾아볼려고 검색해 봤는데 아래와 같은 내용이 나왔는데
아래의 링크 내용은 위의 결과와 반대의 결과로 얘기를 하고 있어서..
 
이 미스터리는 계속 이어집니다. 냠..
 

'Dev > Windows' 카테고리의 다른 글

벤치마킹  (0) 2007.10.17
달라진 기능 (IIS 6.0)  (0) 2007.09.28
COM+ Queued Components  (0) 2007.08.09
SWC (Services Without Components)  (0) 2007.08.08
RestartService  (0) 2007.07.19
MSMQ를 이용해서 비동기로 컴포넌트를 호출방법

COM+ 컴포넌트
- 해당 컴포넌트는 [out] 파라미터가 없어한다
  [out] 파라미터가 있으면 인터페이스 대기 속성이 disable 되어 있다

- COM+의 패키기의 대기화 속성에 "대기"가 체크되어야한다
  당연히 MSMQ가 설치되어야 한다.

- 수신처리하기 위해서는 "수신처리"를 체크하여 큐에 쌓인 내용을 처리함

- 해당 구성요소의 인터페이스 속성에서 대기화의 "대기"를 체크하여 인터페이스를 대기 시킨다



호출방법
- CoGetObject 함수를 이용해서 Queued Component의 인스턴스를 생성하여 사용한다.
   "queue:/new:QCom.Test"


// C++
IUnknown *pUnknown;
HRESULT hr = CoGetObject(L"queue:/new:QCom.Test", NULL, IID_IUnknown, (void**)&pUnknown);
if (FAILED(hr)) {
    cout << "CoGetObject failed " << endl;
}

// pUnknown 를 해당 인터페이스로 변환하여 사용
// 혹은 직접 인터페이스의 IID_ 및 인터페이스 포인터로 접근하여 사용



http://msdn2.microsoft.com/en-us/library/ms683468.aspx
http://msdn2.microsoft.com/en-us/library/ms686762.aspx

'Dev > Windows' 카테고리의 다른 글

달라진 기능 (IIS 6.0)  (0) 2007.09.28
SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
SWC (Services Without Components)  (0) 2007.08.08
RestartService  (0) 2007.07.19
MultiMedia Timer  (0) 2007.05.14

/////////////////////////////////////////////////////////////////////
// C#
using System.EnterpriseServices;

ServiceConfig sc = new ServiceConfig();
sc.TrackingEnabled = true;
sc.Transaction = TransactionOption.Required;
sc.TrackingAppName = "cdecl";
sc.TrackingComponentName = "cdeclcom";

ServiceDomain.Enter(sc);

try {
    Run();
    ContextUtil.SetComplete();
}
catch (Exception ex) {
    ContextUtil.SetAbort();
}

TransactionStatus st = ServiceDomain.Leave();


/////////////////////////////////////////////////////////////////////
// C++ (native)
#include <windows.h>
#include <comsvcs.h>

IUnknown *pUnknown;
HRESULT hr = CoCreateInstance(CLSID_CServiceConfig, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (void**)&pUnknown);

IServiceInheritanceConfig *pInher;
hr = pUnknown->QueryInterface(IID_IServiceInheritanceConfig, (void**)&pInher);
hr = pInher->ContainingContextTreatment(CSC_Inherit);

IServiceTrackerConfig *pTracker;
hr = pUnknown->QueryInterface(IID_IServiceTrackerConfig, (void**)&pTracker);
hr = pTracker->TrackerConfig(CSC_UseTracker, L"CDECL_APP", L"CDECL_COM");

IServiceTransactionConfig *pTran;
hr = pUnknown->QueryInterface(IID_IServiceTransactionConfig, (void**)&pTran);
hr = pTran->ConfigureTransaction(CSC_NewTransaction);
hr = pTran->IsolationLevel(COMAdminTxIsolationLevelReadUnCommitted);

CoEnterServiceDomain(pUnknown);

IObjectContext *ctx;
hr = GetObjectContext(&ctx);

try {
    Run();
    ctx->SetComplete();
}
catch (...) {
    ctx->SetAbort();
    cout << "Unknown Exception " << endl;
}

ctx->Release();

CoLeaveServiceDomain(pUnknown);

pTran->Release();
pTracker->Release();
pInher->Release();
pUnknown->Release();



'Dev > Windows' 카테고리의 다른 글

SQLOLEDB Provider 의 특이한 동작  (0) 2007.09.20
COM+ Queued Components  (0) 2007.08.09
RestartService  (0) 2007.07.19
MultiMedia Timer  (0) 2007.05.14
.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14

void RestartService(std::string strServiceName)
{
    SC_HANDLE hSCM = NULL;
    SC_HANDLE hDns = NULL;

    try {
        hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
        if (!hSCM) {
            cout << "OpenSCManager Error" << endl;
            throw -1;
        }

        hDns = OpenService(hSCM, strServiceName.c_str(), SERVICE_ALL_ACCESS);
        if (!hDns) {
            cout << "OpenService Error" << endl;
            throw -1;
        }

        SERVICE_STATUS schStatus = {0, };

        BOOL bStop = ControlService(hDns, SERVICE_CONTROL_STOP, &schStatus);

        if (bStop) {
            cout << strServiceName << " Stop" << endl;
        }

        BOOL bStart = StartService(hDns, 0, NULL);

        if (bStart) {
            cout << strServiceName << " Start" << endl;
        }
    }
    catch (...) {}

    if (hDns) {
        CloseServiceHandle(hDns);
    }
   
    if (hSCM) {
        CloseServiceHandle(hSCM);
    }
}

'Dev > Windows' 카테고리의 다른 글

COM+ Queued Components  (0) 2007.08.09
SWC (Services Without Components)  (0) 2007.08.08
MultiMedia Timer  (0) 2007.05.14
.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
콘솔에서 Timer 이벤트 처리 방법을 찾다가 발견한 것.
일명 멀티미디어 타이머라 불리는 ..

일반적인 윈도우의 Timer API 보다 정확도가 높고 윈도우 큐를 이용하지 않아 윈도우 없이도 사용 할수 있다는 장점.


About Multimedia Timers

Multimedia Timer Functions

'Dev > Windows' 카테고리의 다른 글

SWC (Services Without Components)  (0) 2007.08.08
RestartService  (0) 2007.07.19
.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
DLL export  (0) 2007.05.14

'Dev > Windows' 카테고리의 다른 글

RestartService  (0) 2007.07.19
MultiMedia Timer  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
DLL export  (0) 2007.05.14
_beginthread, _beginthreadex  (0) 2007.05.14
1. The directory from which the application loaded.

2. The current directory.

3. The system directory. Use the GetSystemDirectory function to get the path of this directory.

4. The Windows directory. Use the GetWindowsDirectory function to get the path of this directory.

5. The directories that are listed in the PATH environment variable.

--
LoadLibrary혹은 DLL을 동적링크할때 특정경로에 관계없이 응용프로그램의 디렉토리에서 먼저 DLL을 로드 하려면 ...

응용프로그램이름 뒤에 ".local" 이란 이름을 가진 빈 파일을 생성한다.
예를들어 응용프로그램 이름이 foo.exe 일때 foo.exe.local 이란 빈 파일을 생성하면 사용하는 DLL을 현재 디렉토리에 있는것 먼저 로드 시킨다.

'Dev > Windows' 카테고리의 다른 글

MultiMedia Timer  (0) 2007.05.14
.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL export  (0) 2007.05.14
_beginthread, _beginthreadex  (0) 2007.05.14
서버 개체 오류 'ASP 0177 : 800401f3'  (1) 2007.03.29

1. 첫번째 방법
__declspec(dllexport) 키워드를 사용한다.
이경우 calling convention이 "__cdecl" 이면 함수이름 그대로 export되지만 calling convention이 윈도우 표준인 "__stdcall" 이면 함수이름규칙이 변한다

[msdn]
__stdcall Name-decoration convention
An underscore (_) is prefixed to the name. The name is followed by the at sign (@) followed by the number of bytes (in decimal) in the argument list. Therefore, the function declared as int func( int a, double b ) is decorated as follows: _func@12



2. 두번째 방법
.def(Module-Definition) 파일을 작성해 export 시킨다.

EXPORTS
   FunctionName

--
DLL에서 Export된 함수확인하기
1. dumpbin /EXPORTS "DLL이름"
2. Depends툴 이용

'Dev > Windows' 카테고리의 다른 글

.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
_beginthread, _beginthreadex  (0) 2007.05.14
서버 개체 오류 'ASP 0177 : 800401f3'  (1) 2007.03.29
VB 지원중단..  (0) 2005.03.23

Create a thread.

unsigned long _beginthread( void( __cdecl *start_address )( void * ), unsigned stack_size, void *arglist );

unsigned long _beginthreadex( void *security, unsigned stack_size, unsigned ( __stdcall *start_address )( void * ), void *arglist, unsigned initflag, unsigned *thrdaddr );


C-Run time 라이브러리를 지원하는 Thread 생성함수들이다.

C-Run time 라이브러리를 지원한다는 뜻은 Thread내에서 C-Run time 함수를 사용했을경우 함수의 정확한 호출을 보장한다는 뜻이다.
ex) strtok


* _beginthread, _beginthreadex의 차이점
_beginthreadex의 경우 상태관리나 NT쪽에서의 보안쪽 파라미터가 추가 되어 있다 (_beginthread의 확장)

Thread 함수의 호출 방식이 틀리다.
_beginthread -> __cdecl
_beginthreadex -> __stdcall


* _endthread, _endthreadex의 차이점
_endthread와 _endthreadex 함수는 _beginthread와 _beginthreadex 에 의해 생성된 Thread함수를 명확히 종료할때 사용하고 Thread함수가 return 되면 자동으로 호출된다.

그러나 _endthreadex는 _endthread와 틀리게 Thread Handle을 자동으로 닫아주지 않는다
그래서 명시적으로 CloseHandle API를 이용해서 Handle을 닫아 주어야 한다

::CloseHandle(handle);

--
MSDN

'Dev > Windows' 카테고리의 다른 글

.NET Enterprise Services 성능 ( vs COM+)  (0) 2007.05.14
DLL 파일 찾는 순서  (0) 2007.05.14
DLL export  (0) 2007.05.14
서버 개체 오류 'ASP 0177 : 800401f3'  (1) 2007.03.29
VB 지원중단..  (0) 2005.03.23

+ Recent posts