64비트 환경에서 32비트 COM 컴포넌트 사용하기.

프로그래밍 2018. 5. 16. 13:21 Posted by 정직한 UnHa Kim
수정> 이 방식으로 COM 함수를 호출하는 것은 잘 되지만, 
        COM이 발생시키는 이벤트를 수신하고 처리하는 게 잘 안 된다.
        Xing API에서는 이러한 이벤트 처리가 필수적이어서,
        이 방안은 더 이상 사용하지 않는다.
        
----------------------------------------------        

인터넷에서 발견한 유용한 팁 번역해서 공유.

32비트 COM객체는 64비트 환경에서 사용하려고 하면, "class not registered"(등록되지 않은 클래스) 에러가 발생한다.

이 문제는 dllhost를 중간에 매개역할을 하도록 하여서 해결할 수 있다.

이를 위해서는 레지스트리 값 몇 개를 수정해야 한다.


  1. COM객체의 GUID를 'HKey_Classes_Root\Wow6432Node\CLSID\[GUID]'에서 찾아낸다.
  2. 찾아낸 후에 REG_SZ (string) 값을 추가한다. 이름은 'AppID', 값은 방금 찾아낸 COM객체 GUID이다.
  3. 'HKey_Classes_Root\Wow6432Node\AppID\' 아래에 새로운 키를 생성한다. 새로운 키의 이름은 COM객체의 GUID이다.
  4. 새로운 키 아래에 REG_SZ (string) 값을 추가한다. 이름은 'DllSurrogate', 값은 공백으로 남겨둔다.
  5. 'HKey_Local_Machine\Software\Classes\AppID\' 아래에 . 이것 또한 새로운 키는 COM객체의 GUID이어야 한다. 이 키 아래에는 새로운 값을 추가할 필요가 없다.


원문 : https://www.convert-in.com/32bit-com-64bit-system.htm


When trying to use old components and APIs, developer may face the following problem: 32bit COM objects are not usable in a 64bit environment. Attempt to access a 32bit COM in a 64bit environment will result "class not registered" error. However this issue can be resolved by using dllhost as a surrogate for the 32bit COM object.

Implementation of this fix involves a number of simple registry modifications:

  1. Locate your COM object GUID under the HKey_Classes_Root\Wow6432Node\CLSID\[GUID]
  2. Once located add a new REG_SZ (string) value. The name must be AppID and data must be the same COM object GUID you have just searched for
  3. Add a new key under HKey_Classes_Root\Wow6432Node\AppID\ The new key must be called the same as GUID of the COM object
  4. Under the new key you've just added, add a new REG_SZ (string) value, and call it DllSurrogate. Leave the value empty.
  5. Create a new key under HKey_Local_Machine\Software\Classes\AppID\. Again the new key must be called the same as the COM object's GUID. No values are necessary to be added under this key.


댓글을 달아 주세요