Microsoft MVP성태의 닷넷 이야기
COM 개체 관련: 22. BB FlashBack SDK와 ActiveX 버전 관리 [링크 복사], [링크+제목 복사],
조회: 27356
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

BB FlashBack SDK와 ActiveX 버전 관리


이 글은, ^^ 저에게 특별한 신뢰를 보내준 "Blueberry Software" 사의 홍보를 겸해서 써봅니다. Blueberry 소프트웨어에서 제공하는 제품 중에서 "FlashBack Screen Recorder SDK"가 있는데요. 화면을 동영상으로 캡쳐해 주는 기능을 제공합니다.

SDK를 설치하면 몇 개의 ActiveX를 레지스트리에 등록하는 데요. 여기서, 보통 우리가 생각지 못한 응용 사례를 하나 볼 수 있습니다.

예를 들어, 화면을 캡쳐하는 ActiveX의 경우 아래와 같이 등록되어 있습니다.

HKEY_CLASSES_ROOT\CLSID\{A3CD4BF9-EC17-47A4-833C-50A324D6FF35}\InprocServer32
REG_SZ 값: BB FlashBack Recorder.dll

그래서, 이렇게 등록된 ActiveX를 사용하면 다음과 같은 오류가 발생합니다.

System.InvalidOperationException was unhandled
  Message="An error occurred creating the form. See Exception.InnerException for details. 
           The error is: 지정된 모듈을 찾을 수 없습니다. (Exception from HRESULT: 0x8007007E)"
  Source="FBRecorderSample"
  StackTrace:
       at FBRecorderSample.My.MyProject.MyForms.Create__Instance__[T](T Instance) in 17d14f5c-a337-4978-8281-53493378c1071.vb:line 190
       at FBRecorderSample.My.MyProject.MyForms.get_MainForm()
       at FBRecorderSample.MainForm.Main() in D:\temp\scr_rec\MainForm.vb:line 7
       at System.AppDomain._nExecuteAssembly(Assembly assembly, String[] args)
       at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args)
       at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
       at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
       at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
       at System.Threading.ThreadHelper.ThreadStart()
  InnerException: System.IO.FileNotFoundException
       Message="지정된 모듈을 찾을 수 없습니다. (Exception from HRESULT: 0x8007007E)"
       Source="System.Windows.Forms"
       StackTrace:
            at System.Windows.Forms.UnsafeNativeMethods.CoCreateInstance(Guid& clsid, Object punkOuter, Int32 context, Guid& iid)
            at System.Windows.Forms.AxHost.CreateWithoutLicense(Guid clsid)
            at System.Windows.Forms.AxHost.CreateWithLicense(String license, Guid clsid)
            at System.Windows.Forms.AxHost.CreateInstanceCore(Guid clsid)
            at System.Windows.Forms.AxHost.CreateInstance()
            at System.Windows.Forms.AxHost.GetOcxCreate()
            at System.Windows.Forms.AxHost.TransitionUpTo(Int32 state)
            at System.Windows.Forms.AxHost.CreateHandle()
            at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
            at System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
            at System.Windows.Forms.AxHost.EndInit()
            at FBRecorderSample.MainForm.InitializeComponent() in D:\temp\scr_rec\MainForm.vb:line 263
            at FBRecorderSample.MainForm..ctor() in D:\temp\scr_rec\MainForm.vb:line 19
       InnerException: 

그럴 수밖에 없는 것이, InprocServer32 키에 해당 ActiveX의 전체 경로가 등록되지 않고 dll 이름만 있기 때문입니다. 처음 이 사실을 알았을 때는, "Blueberry Software"가 등록 코드에 버그를 가지고 있다고 생각했습니다.

그런데, 그들로부터 온 답변이 재미있습니다. 보통, COM 개체에서 버전관리는 ProgID를 통해서 하는데, 실제로 프로그래밍 상에서 COM 개체를 사용하는 것에는 이런 ProgID를 통한 버전 관리가 그다지 의미가 없다는 것입니다. 듣고 보니 ^^ 맞습니다. 돌이켜 보면, 저도 COM 개체 생성을 ProgID로 했던 적은 HTML 페이지에서 생성하는 것을 제외하고는 전무했으니까요.

이런 문제를 InprocServer32에 DLL 이름만 기록하는 것과 함께 해당 DLL을 EXE와 동일한 폴더에 "복사"하는 방식으로 버전 관리를 해결하고 있습니다. 어떠세요? 독특하죠? 괜찮은 응용 사례라고 생각됩니다.



[이 토픽에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 6/27/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 



2011-01-10 03시30분
[짜두] 이 방법이나 아이디어는 괜찮은것 같긴 한데요, 일단 배포를 하려고 한다면 애플리케이션과 동일한 위치에 배포된 "BB FlashBack Recorder.dll" 을 등록해줘야만 실행이 된다는 얘기 아닌가효?
[guest]
2011-01-10 03시36분
[짜두] 음 생각해보니 따로 해줄필요가 없군요. 훌륭한 방법임다~ ^____^
[guest]
2011-01-10 04시34분
등록은 필요하지요. ^^ 대부분의 응용 프로그램은 CLSID 키만을 가지고 조회를 시작하기 때문에. 만약 등록까지도 생략하고 싶다면, 다음과 같은 방법을 써야 합니다.

Registry 등록 없이 COM 개체 사용
; http://www.sysnet.pe.kr/2/1/262
정성태
2011-01-10 04시37분
클릭원스라면.. 이것으로 보시면 되고. ^^

ClickOnce로 ActiveX를 같이 배포하는 방법
; http://www.sysnet.pe.kr/2/0/692
정성태
2011-01-11 09시04분
저도 등록을 해줘야 한다고 생각했었는데, 혹시나 해서 실행해보니 그냥 되더라고요. ^^;; 어떻게 그냥 될 수 있었는지는 좀더 찾아보는 중입니다요~ㅎ
Jaedoo Jd Song
2011-01-11 11시09분
역시 착오였습니다... ^^;;
Jaedoo Jd Song
2011-01-11 11시25분
^^ 다행이군요. 되면 당황스럽죠.
정성태

... 46  47  48  49  50  51  52  53  54  [55]  56  57  58  59  60  ...
NoWriterDateCnt.TitleFile(s)
12562정성태3/15/202117954개발 환경 구성: 550. C# - JIRA REST API 사용 정리 (2) JIRA OAuth 토큰으로 API 사용하는 방법파일 다운로드1
12561정성태3/12/202116705VS.NET IDE: 159. Visual Studio에서 개행(\n, \r) 등의 제어 문자를 치환하는 방법 - 정규 표현식 사용
12560정성태3/11/202117741개발 환경 구성: 549. ssh-keygen으로 생성한 PKCS#1 개인키/공개키 파일을 각각 PKCS8/PEM 형식으로 변환하는 방법
12559정성태3/11/202117995.NET Framework: 1028. 닷넷 5 환경의 Web API에 OpenAPI 적용을 위한 NSwag 또는 Swashbuckle 패키지 사용 [2]파일 다운로드1
12558정성태3/10/202117096Windows: 192. Power Automate Desktop (Preview) 소개 - Bitvise SSH Client 제어 [1]
12557정성태3/10/202115314Windows: 191. 탐색기의 보안 탭에 있는 "Object name" 경로에 LEFT-TO-RIGHT EMBEDDING 제어 문자가 포함되는 문제
12556정성태3/9/202113571오류 유형: 703. PowerShell ISE의 Debug / Toggle Breakpoint 메뉴가 비활성 상태인 경우
12555정성태3/8/202116877Windows: 190. C# - 레지스트리에 등록된 DigitalProductId로부터 라이선스 키(Product Key)를 알아내는 방법파일 다운로드2
12554정성태3/8/202116436.NET Framework: 1027. 닷넷 응용 프로그램을 위한 PDB 옵션 - full, pdbonly, portable, embedded
12553정성태3/5/202116429개발 환경 구성: 548. 기존 .NET Framework 프로젝트를 .NET Core/5+ 용으로 변환해 주는 upgrade-assistant, try-convert 도구 소개 [4]
12552정성태3/5/202115872개발 환경 구성: 547. github workflow/actions에서 Visual Studio Marketplace 패키지 등록하는 방법
12551정성태3/5/202114253오류 유형: 702. 비주얼 스튜디오 - The 'CascadePackage' package did not load correctly. (2)
12550정성태3/5/202113981오류 유형: 701. Live Share 1.0.3713.0 버전을 1.0.3884.0으로 업데이트 이후 ContactServiceModelPackage 오류 발생하는 문제
12549정성태3/4/202115281오류 유형: 700. VsixPublisher를 이용한 등록 시 다양한 오류 유형 해결책
12548정성태3/4/202116391개발 환경 구성: 546. github workflow/actions에서 nuget 패키지 등록하는 방법
12547정성태3/3/202117057오류 유형: 699. 비주얼 스튜디오 - The 'CascadePackage' package did not load correctly.
12546정성태3/3/202116898개발 환경 구성: 545. github workflow/actions에서 빌드시 snk 파일 다루는 방법 - Encrypted secrets
12545정성태3/2/202119750.NET Framework: 1026. 닷넷 5에 추가된 POH (Pinned Object Heap) [10]
12544정성태2/26/202119956.NET Framework: 1025. C# - Control의 Invalidate, Update, Refresh 차이점 [2]
12543정성태2/26/202117947VS.NET IDE: 158. C# - 디자인 타임(design-time)과 런타임(runtime)의 코드 실행 구분
12542정성태2/20/202119619개발 환경 구성: 544. github repo의 Release 활성화 및 Actions를 이용한 자동화 방법 [1]
12541정성태2/18/202117184개발 환경 구성: 543. 애저듣보잡 - Github Workflow/Actions 소개
12540정성태2/17/202118287.NET Framework: 1024. C# - Win32 API에 대한 P/Invoke를 대신하는 Microsoft.Windows.CsWin32 패키지
12539정성태2/16/202118206Windows: 189. WM_TIMER의 동작 방식 개요파일 다운로드1
12538정성태2/15/202118675.NET Framework: 1023. C# - GC 힙이 아닌 Native 힙에 인스턴스 생성 - 0SuperComicLib.LowLevel 라이브러리 소개 [2]
12537정성태2/11/202119357.NET Framework: 1022. UI 요소의 접근은 반드시 그 UI를 만든 스레드에서! - 두 번째 이야기 [2]
... 46  47  48  49  50  51  52  53  54  [55]  56  57  58  59  60  ...