Visual C++로 XPCOM 컴포넌트 만드는 방법

Posted by 빵빵빵
2009/02/09 20:00 전산(컴퓨터)/PC-Windows



Visual C++로 XPCOM 컴포넌트 만드는 방법


모질라 파이어폭스에서 사용하기 위한 XPCOM 컴포넌트를 만들기 위해서 Visual C++를 사용할 수 있는 방법에 대한 설명입니다. 일반적으로 XPCOM을 만드는 경우 GCC를 많이 사용하겠지만 Windows 환경이라면 역시 Visual C++을 이용해서 XPCOM을 만들 수 있다면 더 편리할 것입니다.
모질라 개발자 사이트에 있는 내용을 참고하였고 XPCOM 개발에 대한 기본적인 지식이 있는 것으로 전제합니다. XPCOM에 대한 자세한 내용은 Mozilla Developer Center를 참고하시기 바랍니다.

개발 환경 설정

먼저 Visual C++이 설치되어 있어야 합니다. Microsoft에서 무료로 배포하는 Visual C++ Express를 사용할 수도 있습니다. 여기서는 Visual C++ 2005를 사용했습니다.
다음으로 Gecko SDK를 설치해야 합니다. gecko-sdk-win32-msvc-1.8.0.4.zip을 다운로드해서 프로젝트의 상위 폴더에 압축을 풀어 줍니다. 압축을 풀면 gecko-sdk라는 폴더가 생성됩니다.
다음으로 Gecko SDK에 있는 툴(xpidl)을 사용하기 위해서 wintools.zip에 포함된 glib-1.2.dll과 libIDL-0.6.dll을 Gecko SDK 폴더에 있는 bin 폴더(gecko-sdk\bin)에 복사해줍니다.


VC++ 프로젝트 생성

먼저 VC++ Win32 DLL 프로젝트를 Gecko SDK의 압축을 해제했던 폴더에 생성합니다. 프로젝트 속성의 구성 속성에서 다음 속성값을 변경해줍니다.

C/C++ >  추가 포함 디렉터리에 "..\gecko-sdk\include"를 추가합니다.

C/C++ > 전처리기 > 전처리기 정의에 "XP_WIN;XP_WIN32"를 추가합니다.

링커 > 일반 > 추가 라이브러리 디렉터리에 "..\gecko-sdk\lib"를 추가합니다.

링커 > 입력 > 추가 종속성에 "nspr4.lib xpcom.lib xpcomglue_s.lib"를 추가합니다.

C/C++ > 미리 컴파일된 헤더 > 미리 컴파일된 헤더 만들기/사용을 미리 컴파일된 헤더 사용 안 함으로 설정합니다.(프로젝트를 생성할 때 빈 프로젝트로 생성하면 디폴트값)

XPCOM IDL 파일은 사용자 지정 빌드를 설정합니다.(속성 설정 방법은 아래에 다시 설명하겠습니다)

간단히 설명하기 위해서 예제는 모질라 개발자 사이트에 있는 xpcom-test.zip을 사용하겠습니다.


XPCOM 컴포넌트 생성

먼저 컴포넌트 인터페이스에 대한 XPCOM IDL을 만듭니다.


XPCOM IDL에 대한 사용자 지정 빌드를 수행할 배치파일(*.bat)를 프로젝트 폴더에 만듭니다. Gecko SDK의 gecko-sk\bin에 있는 xpidl.exe를 실행하도록 다음과 같이 편집하면 됩니다. 프로젝트 폴더와 gecko-sdk 폴더가 같은 폴더에 있다고 할 경우입니다.(이 예제에서는 xpidl-build.bat로 생성합니다.)



다음으로 XPCOM IDL의 속성(구성 속성)에서 사용자 지정 빌드를 설정합니다.
일반 > 도구에서 사용자 지정 빌드 도구를 선택합니다.(다음 속성 변경을 위해 적용 필요)
사용자 지정 빌드 단계 > 명령줄에 "$(ProjectDir)xpidl-build.bat $(InputFileName)"를 입력합니다.
사용자 지정 빌드 단계 > 출력에 .\$(InputName).h를 입력합니다.
C++로 XPCOM 컴포넌트를 구현합니다.


헤더 파일




소스 파일



XPCOM 모듈 구현을 만듭니다.



NS_IMPL_NSGETMODULE("SpecialThingsModule", components)
이것으로 XPCOM 컴포넌트를 빌드할 수 있게 되었습니다.
파이어폭스에 확장 기능(Extension)으로 설치
이제 만들어진 컴포넌트를 부가 기능(Extension)으로 파이어폭스에 설치해봅시다.
먼저 다음과 같은 내용으로 install.rdf 파일을 생성합니다.
<?xml version="1.0" encoding="UTF-8"?>
<RDF xmlns="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
 xmlns:em="http://www.mozilla.org/2004/em-rdf#">
  <Description about="urn:mozilla:install-manifest">
    <em:id>specialthing@starkravingfinkle.org</em:id>
    <em:name>specialthing</em:name>
    <em:version>1.0</em:version>
    <em:creator>Still</em:creator>
    <em:description>specialthing</em:description>
    <em:targetApplication>
      <Description>
        <em:id>{ec8030f7-c20a-464f-9b0e-13a3a9e97384}</em:id> <!-- firefox -->
        <em:minVersion>2.0</em:minVersion>
        <em:maxVersion>2.0.0.*</em:maxVersion>
      </Description>
    </em:targetApplication>
  </Description>
</RDF>
다음 내용으로 chrome.manifest를 생성합니다.
content specialthing content/
locale specialthing en-US locale/en-US/
skin specialthing classic/1.0 skin/
overlay chrome://browser/content/browser.xul chrome://specialthing/content/firefoxOverlay.xul
content 폴더를 만들고 다음 내용으로 firefoxOverlay.xul을 만듭니다.
<?xml version="1.0" encoding="UTF-8"?>
<overlay id="specialthing-overlay"
         xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
  <menupopup id="menu_ToolsPopup">
    <menuitem id="specialthing" label="SpecialThing"
              oncommand="
{
  try {
    const cid = '@starkravingfinkle.org/specialthing;1';
    var obj = Components.classes[cid].createInstance();
    obj = obj.QueryInterface(Components.interfaces.ISpecialThing);
  }
  catch (err) {
    alert(err);
    return;
  }
  var res = obj.add(3, 4);
  alert('3+4 = ' + res);
  var name = obj.name;
  alert('Name = ' + name);
  obj.name = 'New Name';
  name = obj.name;
  alert('Name = ' + name);
}
"/>
  </menupopup>
</overlay>
components 폴더를 만들고 해당 폴더로 프로젝트 폴더에 있는 xpt 파일과 빌드된 dll 파일을 복사합니다.
install.rdf 파일과 chrome.manifest 파일, contents 폴더, components 폴더를 zip 파일로 압축합니다.
압축한 zip 파일의 확장자를 xpi로 변경합니다.
xpi 파일을 파이어폭스에 드래그앤드롭하면 설치 화면이 나오고 화면에 따라 설치합니다.
파이어폭스를 다시 시작해서 도구 메뉴에서 SpecialThing을 선택하면 XPCOM을 실행한 결과를 확인할 수 있습니다.
2009/02/09 20:00 2009/02/09 20:00

Visual C++ 2005 CRT DLL 버전 충돌 문제

Posted by 빵빵빵
2009/02/09 19:55 전산(컴퓨터)/PC-Windows



Visual C++ 2005 CRT DLL 버전 충돌 문제

VS2005 CRT DLL(msvcp80.dll, msvcr80.dll)을 사용하는 COM 모듈을 개발할 때 설치 대상 PC에 .NET 2.0 SP1이나 .NET 3.0 SP1이 설치되어 있는 경우 COM 등록 시에 로드하는 CRT DLL 버전 8.0.50727.762를 side by side assemblies 기능에서 자동으로 8.0.50727.1433으로 리다이렉트해준다. 문제는 1433 버전으로 작동하는 경우 COM 등록이 안 되는 등의 에러가 발생한다. Isolated COM이나 Per-application Configuration(Windows XP, Windows Vista)으로도 해결할 수 있지만 가장 간단한 방법은 Private Assemblies로 항상 762 버전을 사용하도록 하는 것이다.

참고)
http://www.microsoft.com/communities/newsgroups/en-us/default.aspx?dg=microsoft.public.vc.mfc&tid=ab5bc68a-3bf1-4537-9285-5697048f13ed&cat=&lang=&cr=&sloc=&p=1

http://forums.msdn.microsoft.com/en-US/vcgeneral/thread/0f627804-d4d6-4606-bb2a-a5cc0516767d/

http://forums.msdn.microsoft.com/en-US/vcgeneral/thread/dc5c726b-4888-4c68-9a07-b63cdee937ea/


출처 : http://still.tistory.com/32
2009/02/09 19:55 2009/02/09 19:55

Subverison을 위한 Windows Tools

Posted by 빵빵빵
2009/02/09 19:54 전산(컴퓨터)/PC-Windows



Subverison을 위한 Windows Tools

Windows 개발에서 Subversion을 이용하고자 할 때 유용할 만한 툴을 두가지 소개한다. TortoiseSVN도 많이 사용되지만 아마도 대부분 알테니 넘어가겠다.

VisualSVN Server

원래 VisualSVN이라는 Visual Studio에서 Subverison을 사용하기 위한  플러그인을 개발하던 곳에서 만든 Subverison server 설치용 패키지이다. 설치하게 되면 Management Console을 제공해서 굳이 텍스트 파일로된 설정 파일들을 건드리지 않아도 쉽게 Subversion server를 관리할 수 있다. VisualSVN은 유료지만 VisualSVN Server는 무료로 제공하고 있으니 간단하게 Subversion server를 사용하고자 한다면 추천한다.







AnkhSVN

Subverison을 사용하기 위한 Visual Studio용 플러그인이다. 물론 다른 플러그인으로 앞에서 언급된 VisualSVN이 있지만 역시 오픈소스에 무료 소프트웨어라 부담이 없다. 그렇다고 기능이 부족하거나 안정성이 떨어지는 것은 아니다. 특히 버전 2.0부터는 기능적으로 Visual Studio와 잘 통합되어 깔끔하게 동작하는 것이 마음에 든다. 단 버전 2.0은 VS 2005이상에서만 동작한다. VS 2002나 2003에서 쓰려면 아쉽지만 1.0대 버전을 사용해야 한다. 그리고 VS 6.0은 지원하지 않는다.


얼마 전까지만 해도 Visual SourceSafe를 버전 컨트롤 시스템으로 썼었는데 개발 환경을 Visual Studio 6.0에서 Visual Studio 2005로 변경하면서 어떤 버전 컨트롤 시스템을 사용할 것인지 고민을 했었다. SourceSafe는 Team Foundation Server가 나오면서 더 이상 발전이 없을 듯 하고 Team Foundation Server를 사용하기에는 개발 규모나 비용 면에서 맞지가 않았다. 그래서 Subversion을 선택한 것인데 몇년 전에 테스트해봤을 때는 불편한 점이 많았지만 최근에는 다양한 툴이 많이 나와 있어서 SourceSafe와 비교해 부족함이 없고 오히려 다른 장점이 많은 듯 하다.

출처 : http://still.tistory.com/35
2009/02/09 19:54 2009/02/09 19:54