Microsoft MVP성태의 닷넷 이야기
COM 개체 관련: 22. BB FlashBack SDK와 ActiveX 버전 관리 [링크 복사], [링크+제목 복사],
조회: 27357
글쓴 사람
정성태 (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)
12637정성태5/10/202117775사물인터넷: 62. NodeMCU v1 ESP8266 보드의 A0 핀에 다중 아날로그 센서 연결 [1]
12636정성태5/10/202117988사물인터넷: 61. NodeMCU v1 ESP8266 보드의 A0 핀 사용법 - FSR-402 아날로그 압력 센서 연동파일 다운로드1
12635정성태5/9/202116327기타: 81. OpenTabletDriver를 (관리자 권한으로 실행하지 않고도) 관리자 권한의 프로그램에서 동작하게 만드는 방법
12634정성태5/9/202114798개발 환경 구성: 572. .NET에서의 필수 무결성 제어 - 외부 Manifest 파일을 두는 방법파일 다운로드1
12633정성태5/7/202117743개발 환경 구성: 571. UAC - 관리자 권한 없이 UIPI 제약을 없애는 방법
12632정성태5/7/202118971기타: 80. (WACOM도 지원하는) Tablet 공통 디바이스 드라이버 - OpenTabletDriver
12631정성태5/5/202117784사물인터넷: 60. ThingSpeak 사물인터넷 플랫폼에 ESP8266 NodeMCU v1 + 조도 센서 장비 연동파일 다운로드1
12630정성태5/5/202118536사물인터넷: 59. NodeMCU v1 ESP8266 보드의 A0 핀 사용법 - CdS Cell(GL3526) 조도 센서 연동파일 다운로드1
12629정성태5/5/202120298.NET Framework: 1057. C# - CoAP 서버 및 클라이언트 제작 (UDP 소켓 통신) [1]파일 다운로드1
12628정성태5/4/202118209Linux: 39. Eclipse 원격 디버깅 - Cannot run program "gdb": Launching failed
12627정성태5/4/202118300Linux: 38. 라즈베리 파이 제로 용 프로그램 개발을 위한 Eclipse C/C++ 윈도우 환경 설정
12626정성태5/3/202118404.NET Framework: 1056. C# - Thread.Suspend 호출 시 응용 프로그램 hang 현상 (2)파일 다운로드1
12625정성태5/3/202116886오류 유형: 714. error CS5001: Program does not contain a static 'Main' method suitable for an entry point
12624정성태5/2/202121356.NET Framework: 1055. C# - struct/class가 스택/힙에 할당되는 사례 정리 [10]파일 다운로드1
12623정성태5/2/202117675.NET Framework: 1054. C# 9 최상위 문에 STAThread 사용 [1]파일 다운로드1
12622정성태5/2/202113530오류 유형: 713. XSD 파일을 포함한 프로젝트 - The type or namespace name 'TypedTableBase<>' does not exist in the namespace 'System.Data'
12621정성태5/1/202118418.NET Framework: 1053. C# - 특정 레지스트리 변경 시 알림을 받는 방법 [1]파일 다운로드1
12620정성태4/29/202121556.NET Framework: 1052. C# - 왜 구조체는 16 바이트의 크기가 적합한가? [1]파일 다운로드1
12619정성태4/28/202121544.NET Framework: 1051. C# - 구조체의 크기가 16바이트가 넘어가면 힙에 할당된다? [2]파일 다운로드1
12618정성태4/27/202119806사물인터넷: 58. NodeMCU v1 ESP8266 CP2102 Module을 이용한 WiFi UDP 통신 [1]파일 다운로드1
12617정성태4/26/202117079.NET Framework: 1050. C# - ETW EventListener의 Keywords별 EventId에 따른 필터링 방법파일 다운로드1
12616정성태4/26/202116776.NET Framework: 1049. C# - ETW EventListener를 상속받았을 때 초기화 순서파일 다운로드1
12615정성태4/26/202114021오류 유형: 712. Microsoft Live 로그인 - 계정을 선택하는(Pick an account) 화면에서 진행이 안 되는 문제
12614정성태4/24/202118352개발 환경 구성: 570. C# - Azure AD 인증을 지원하는 ASP.NET Core/5+ 웹 애플리케이션 예제 구성 [4]파일 다운로드1
12613정성태4/23/202116695.NET Framework: 1048. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (2) 관리 코드파일 다운로드1
12612정성태4/23/202116569.NET Framework: 1047. C# - ETW 이벤트의 Keywords에 속한 EventId 구하는 방법 (1) PInvoke파일 다운로드1
... 46  47  48  49  50  51  [52]  53  54  55  56  57  58  59  60  ...