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

1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
13517정성태1/8/20242220스크립트: 63. Python - 공개 패키지를 이용한 위성 이미지 생성 (pystac_client, odc.stac)
13516정성태1/7/20242346닷넷: 2196. IIS - AppPool의 "Disable Overlapped Recycle" 옵션의 부작용
13515정성태1/6/20242622닷넷: 2195. async 메서드 내에서 C# 7의 discard 구문 활용 사례 [1]
13514정성태1/5/20242312개발 환경 구성: 702. IIS - AppPool의 "Disable Overlapped Recycle" 옵션
13513정성태1/5/20242225닷넷: 2194. C# - WebActivatorEx / System.Web의 PreApplicationStartMethod 특성
13512정성태1/4/20242176개발 환경 구성: 701. IIS - w3wp.exe 프로세스의 ASP.NET 런타임을 항상 Warmup 모드로 유지하는 preload Enabled 설정
13511정성태1/4/20242199닷넷: 2193. C# - ASP.NET Web Application + OpenAPI(Swashbuckle) 스펙 제공
13510정성태1/3/20242120닷넷: 2192. C# - 특정 실행 파일이 있는지 확인하는 방법 (Linux)
13509정성태1/3/20242169오류 유형: 887. .NET Core 2 이하의 프로젝트에서 System.Runtime.CompilerServices.Unsafe doesn't support netcoreapp2.0.
13508정성태1/3/20242239오류 유형: 886. ORA-28000: the account is locked
13507정성태1/2/20242884닷넷: 2191. C# - IPGlobalProperties를 이용해 netstat처럼 사용 중인 Socket 목록 구하는 방법파일 다운로드1
13506정성태12/29/20232481닷넷: 2190. C# - 닷넷 코어/5+에서 달라지는 System.Text.Encoding 지원
13505정성태12/27/20233003닷넷: 2189. C# - WebSocket 클라이언트를 닷넷으로 구현하는 예제 (System.Net.WebSockets)파일 다운로드1
13504정성태12/27/20232584닷넷: 2188. C# - ASP.NET Core SignalR로 구현하는 채팅 서비스 예제파일 다운로드1
13503정성태12/27/20232447Linux: 67. WSL 환경 + mlocate(locate) 도구의 /mnt 디렉터리 검색 문제
13502정성태12/26/20232566닷넷: 2187. C# - 다른 프로세스의 환경변수 읽는 예제파일 다운로드1
13501정성태12/25/20232326개발 환경 구성: 700. WSL + uwsgi - IPv6로 바인딩하는 방법
13500정성태12/24/20232418디버깅 기술: 194. Windbg - x64 가상 주소를 물리 주소로 변환
13498정성태12/23/20233106닷넷: 2186. 한국투자증권 KIS Developers OpenAPI의 C# 래퍼 버전 - eFriendOpenAPI NuGet 패키지
13497정성태12/22/20232506오류 유형: 885. Visual Studiio - error : Could not connect to the remote system. Please verify your connection settings, and that your machine is on the network and reachable.
13496정성태12/21/20232493Linux: 66. 리눅스 - 실행 중인 프로세스 내부의 환경변수 설정을 구하는 방법 (gdb)
13495정성태12/20/20232420Linux: 65. clang++로 공유 라이브러리의 -static 옵션 빌드가 가능할까요?
13494정성태12/20/20232597Linux: 64. Linux 응용 프로그램의 (C++) so 의존성 줄이기(ReleaseMinDependency) - 두 번째 이야기
13493정성태12/19/20232741닷넷: 2185. C# - object를 QueryString으로 직렬화하는 방법
13492정성태12/19/20232414개발 환경 구성: 699. WSL에 nopCommerce 예제 구성
13491정성태12/19/20232272Linux: 63. 리눅스 - 다중 그룹 또는 사용자를 리소스에 권한 부여
1  2  3  4  [5]  6  7  8  9  10  11  12  13  14  15  ...