Microsoft MVP성태의 닷넷 이야기
COM 개체 관련: 22. BB FlashBack SDK와 ActiveX 버전 관리 [링크 복사], [링크+제목 복사],
조회: 29138
글쓴 사람
정성태 (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분
^^ 다행이군요. 되면 당황스럽죠.
정성태

... 106  107  108  109  [110]  111  112  113  114  115  116  117  118  119  120  ...
NoWriterDateCnt.TitleFile(s)
11209정성태5/25/201770272Windows: 143. Windows 10의 Recovery 파티션을 삭제 및 새로 생성하는 방법 [16]
11208정성태5/25/201729010오류 유형: 390. diskpart의 set id 명령어에서 "The specified type is not in the correct format." 오류 발생
11207정성태5/24/201729897Windows: 142. Windows 10의 복구 콘솔로 부팅하는 방법
11206정성태5/24/201723060오류 유형: 389. DISM.exe - The specified image in the specified wim is already mounted for read/write access.
11205정성태5/24/201722837.NET Framework: 658. C#의 tail call 구현은? [1]
11204정성태5/22/201732361개발 환경 구성: 316. 간단하게 살펴보는 Docker for Windows [7]
11203정성태5/19/201719704오류 유형: 388. docker - Host does not exist: "default"
11202정성태5/19/201720764오류 유형: 387. WPF - There is no registered CultureInfo with the IetfLanguageTag 'ug'.
11201정성태5/16/201724306오류 유형: 386. WPF - .NET 3.5 이하에서 TextBox에 한글 입력 시 TextChanged 이벤트의 비정상 종료 문제 [1]파일 다운로드1
11200정성태5/16/201721072오류 유형: 385. WPF - 폰트가 없어 System.IO.FileNotFoundException 예외가 발생하는 경우
11199정성태5/16/201722266.NET Framework: 657. CultureInfo.GetCultures가 반환하는 값
11198정성태5/10/201724344.NET Framework: 656. Windows Forms의 오류(Exception) 처리 방법에 대한 차이점 설명
11197정성태5/8/201720532개발 환경 구성: 315. VHD 파일의 최소 크기파일 다운로드1
11196정성태5/4/201721946오류 유형: 384. Msvm_ImageManagementService WMI 객체를 사용할 때 오류 상황 정리 [1]
11195정성태5/3/201722728.NET Framework: 655. .NET Framework 4.7 릴리스
11194정성태5/3/201724253오류 유형: 383. net use 명령어로 네트워크 드라이브 연결 시 "System error 67 has occurred." 오류 발생
11193정성태5/3/201722191Windows: 141. 설치된 Windows로부터 설치 이미지를 만드는 방법
11192정성태5/2/201723578Windows: 140. unattended.xml/autounattend.xml 파일을 마련하는 방법
11191정성태5/2/201724415Windows: 139. Dell Venue 8 Pro 태블릿에 USB를 이용한 윈도우 운영체제 설치 방법
11190정성태5/2/201729822Windows: 138. Windows 운영체제의 ISO 설치 파일에 미리 Device driver를 준비하는 방법
11189정성태5/2/201721173Windows: 137. Windows 7 USB/DVD DOWNLOAD TOOL로 98%에서 실패하는 경우
11188정성태4/27/201723956VC++: 118. Win32 HANDLE 자료형의 이모저모 [2]
11187정성태4/26/201724873개발 환경 구성: 314. C# - PowerPoint 확장 Add-in 만드는 방법 [1]파일 다운로드1
11186정성태4/24/201722812VS.NET IDE: 117. Visual Studio 확장(VSIX)을 이용해 사용자 매크로를 추가하는 방법 [1]파일 다운로드1
11185정성태4/22/201720422VS.NET IDE: 116. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법 (2) - 동적 메뉴 구성파일 다운로드1
11184정성태4/21/201722090VS.NET IDE: 115. Visual Studio 확장(VSIX)을 이용해 사용자 메뉴 추가하는 방법파일 다운로드1
... 106  107  108  109  [110]  111  112  113  114  115  116  117  118  119  120  ...