본문 바로가기
Borland

비스타 ActiveX 만들기

by leo21c 2008. 2. 14.

비스타용 ActiveX를 만들기 위해 많은 웹문서들과 가이드를 참고한 내용들을 정리했다.
내가 만든 ActiveX와 가장 잘 맞는 방법을 찾아서 적용하기까지
정말 많은 도움이 되었던 문서들을 만들어 주신분들 정말 고맙습니다.

지금껏 관리자권한으로 실행되던 ActiveX에서의 작업들이 비스타에서 작동되지 않는다.

관리자권한이 필요한 항목
- 파일생성
- 파일삭제
- 파일쓰기
- 파일이동
- 레지스트생성/쓰기/삭제 (HKLM)

정의)
기존의 ActiveX --> A
관리자 권한 ActiveX --> B

비스타에서도 일반사용자로 IE를 실행하여 A를 실행하여도 특정 폴더(사용자폴더)에는
위에 나열한 작업들이 잘 된다. 관리자권한이 필요한 부분은 임의의 디렉토리에 접근하여
작업을 하는 경우이다. 지금 사용하고 있는 ActiveX가 위의 작업을 하지 않는다면 비스타용으로
따로 만들어 배포할 필요가 없지만 불행히도 내가 무심코 만들었던 ActiveX들은 상당부분
관리자권한이 필요했다.

그래서 관리자권한이 필요한 함수들만 따로 모아 새로운 ActiveX를 만들고
A에서 B의 인터페이스를 얻어서 해당함수를 호출하면 된다.
이렇게 하면 A들 모두에서 하나의 B를 사용할 수 있다.

A는 IE에서 실행되고 B는 dllhost.exe에서 실행된다.

주의사항)


1. A에 윈도우즈버전을 체크하는 함수를 추가한 후 비스타일 경우 B의 인터페이스 메소드를 호출한다.


2. 2개의 ActvieX가 실행되는 프로세스가 다르기 때문에 WriteFile 같은 함수를 사용할 때는
Memory Mapped File(공유메모리)를 사용하였다.


3. A 메인스레드에서 B의 인터페이스 포인터를 얻은 후 A의 자식스레드에서 B의 인터페이스 포인터를
사용할 때 A의 메인스레드와 자식스레드는 다른 아파트먼트안에서 실행되기 때문에
B의 인터페이스 포인터를 마샬링해야 한다.


4. 배포시 A 자체도 코드사이닝해야한다. 기존에는 cab파일만 코드사이닝하면 되었지만 권한상승
대화상자에 출처가 표시된 확인상자가 생성되게 하려면 A 자체에 코드사이닝한다.

위 4가지 사항만 주의해서 처리하면 비스타용 ActiveX를 만들 수 있다.
하지만 A에 비스타일 경우 처리하는 코드를 반드시 넣어줘야 하고 관리자권한이 필요한 작업시
B의 인터페이스 메소드를 호출해야만 한다. 상당히 귀찮은 작업이다.
수정을 많이 하지 않는 방법을 찾아보았지만 결국은 찾을 수 없어서 이러한 방법을 사용하였다.

테스트할 수 있는 웹페이지, A, B를 참고하시면 쉽게 비스타용 ActiveX를 만드실 수 있을겁니다.
샘플파일 구성은 아래와 같습니다

vista_activex_test.zip
VistaTest.htm : 테스트 웹페이지
VistActiveX.zip : 기존 ActiveX --> IE에서 실행
XLevelUp.zip : 권한상승 ActiveX --> dllhost.exe에서 실행

# 추가적으로 ActiveX를 ocx로 만들어서 테스트 해봤는데 문제없이 잘 실행되었다.

#추가
비스타 관리자 계정이 아닌경우 일반계정에서도 정상적으로 권한 상승이 될 수 있는 코드를
VistaActiveX와 XLevelUp에 모두 추가하였습니다.
그리고 VS2005를 사용해서 만들때 ms런타임 라이브러리와 atl80.dll 링크가 되어서
배포에 어려움이 있었습니다. 그래서 ms런타임라이브러리와 atl80.dll이 링크되지 않도록
프로젝트 속성-일반 에서 MFC사용은 "정적라이브러에서 MFC사용", ATL사용은 "ATL에 정적링크"로
변경하여 컴파일했습니다. 아래의 코드 예제는 위의 사항을 모두 반영하였습니다.