programing

다음 오류로 인해 CLSID가 {XXXX}인 구성 요소에 대한 COM 클래스 팩토리를 검색하지 못했습니다. 80040154

firstcheck 2023. 5. 13. 21:43
반응형

다음 오류로 인해 CLSID가 {XXXX}인 구성 요소에 대한 COM 클래스 팩토리를 검색하지 못했습니다. 80040154

저는 C#을 사용하여 Windows 서비스를 개발했습니다.PDF 보고서를 생성하는 NET.PDF 파일을 생성하기 위해 타사 dll을 사용하고 있습니다.응용 프로그램이 내 Windows XP 플랫폼에서 실행되고 있습니다.윈도우즈 Server 2008 64비트 버전에서 서비스를 배포할 때 다음 오류가 발생했습니다.

CLSID가 {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}인 구성 요소에 대해 COM 클래스 팩토리를 검색하지 못했습니다. 80040154 오류가 발생했습니다.

regsvr32 명령을 사용하여 DLL을 등록했습니다.레지스트리에서 이 CLSID를 볼 수 있습니다.하지만 문제는 계속됩니다.

무엇이 문제일까요?

VS - 프로젝트 속성 - 빌드 탭 - 플랫폼 대상 =X86

저는 매우 비슷한 문제에 부딪혔습니다.

64비트 시스템에서 개발 중인 웹 응용 프로그램 내에서 오래된 32비트 DLL을 사용해야 했습니다.32비트 DLL을 windows\sys에 등록했습니다.WOW64 폴더에서 regsvr32 버전을 사용합니다.

타사 DLL에 대한 호출은 Visual Studio의 장치 테스트에서 작동했지만 동일한 시스템의 IIS에서 호스팅되는 웹 응용 프로그램에서 80040154 오류로 실패했습니다.

응용 프로그램 풀을 "32비트 응용 프로그램 사용"으로 변경하여 이 문제를 해결했습니다.

COM 구성 요소를 사용하는 64비트에서 오류를 발생시키는 'Any CPU'에 대해 서비스가 구축된 것처럼 들립니다.다음을 위해 구축해야 합니다.x86.

웹 사이트가 32비트 프로세스로 실행되고 있기 때문에 구성 요소를 사용할 수 있습니다.에 대비한 x86그러면 서비스가 32비트로 실행됩니다.

프로젝트 속성 플랫폼 대상 X86을 구성할 필요가 없습니다.x86과 함께 작동하도록 iis 옵션을 구성할 수도 있습니다.

  • 애플리케이션 풀 선택
  • 앱에서 사용하는 풀 선택
  • 고급 설정
  • 32비트 응용 프로그램 true 사용

Any CPU 응용 프로그램을 다시 컴파일하지 않고 이 작업을 수행할 수 있는 방법을 찾고 있다면 다음과 같은 해결 방법이 있습니다.

  1. HKey_Classes_Root\에서 COM 개체 GUID를 찾습니다.Wow6432 노드\CLSID\{GUID}
  2. 위치가 확인되면 새 REG_SZ(문자열) 값을 추가합니다.이름은 앱이어야 합니다.ID 및 데이터는 방금 검색한 COM 개체 GUID와 동일해야 합니다.
  3. HKey_Classes_Root\에서 새 키 추가Wow6432 노드\AppID. 새 키는 COM 개체 GUID와 동일하게 호출되어야 합니다.
  4. 방금 추가한 새 키 아래에 새 문자열 값을 추가하고 DllSurgate라고 합니다.값을 비워 둡니다.
  5. HKey_Local_Machine\Software\Classes\App에서 새 키 생성ID\ 다시 새 키는 COM 개체의 GUID와 동일하게 호출되어야 합니다.이 키 아래에 값을 추가할 필요가 없습니다.

저는 그 해결책에 대해 인정하지 않지만, 그것은 우리에게 효과가 있었습니다.자세한 내용 및 기타 의견은 소스 링크를 확인하십시오.

출처: https://techtalk.gfi.com/32bit-object-64bit-environment/

문제는 서버 프로세스가 64비트이고 라이브러리가 32비트이며 동일한 프로세스(프로세스 내 서버)에서 COM 구성 요소를 생성하려고 한다는 것입니다.서버를 다시 컴파일하여 32비트로 만들거나 서버를 변경하지 않고 COM 구성 요소를 처리하지 않도록 합니다.COM 서버를 중단시키는 가장 쉬운 방법은 COM+ 응용프로그램 - 제어판 -> 관리 도구 -> 구성요소 서비스를 만드는 것입니다.

저도 같은 문제가 있었지만, 다른 답변들은 솔루션의 일부만 제공했습니다.

해결책은 두 가지입니다.

레지스터에서 64비트를 제거합니다.

  • c:\windows\system32\regsvr32.exe /U <file.dll>
  • 이렇게 하면 다른 폴더에 있는 다른 복사된 dll에 대한 참조가 제거되지 않습니다.

또는

  • HKEY_CLASSES_ROOT\CLSID라는 키를 찾습니다{....}\InprocServer32.이 키에는 DLL의 파일 이름이 기본값으로 지정됩니다.
  • HKEY_CLASSES_ROOT\CLSID{....} 폴더를 제거했습니다.

32비트로 등록합니다.

  • C:\Windows\SysWOW64\regsvr32 <file.dll>

64비트 등록을 제거하지 않고 32비트로 등록해도 문제가 해결되지 않습니다.

컴파일 설정을 변경하지 않았습니다.

AppPool 고급 설정에서 "32비트 응용 프로그램 활성화 = True"를 설정하기만 하면 됩니다.

그것은 나에게 효과가 있었다.

윈도우즈 2008 서버 x64용 솔루션은 다음과 같습니다.

  1. open cmd.관리자 권한을 가진 exe.
  2. dll을 C: 폴더에 복사합니다.\Windows\SysWOW64
  3. C에서 regsvr32를 실행합니다.\Windows\SysWOW64
  4. dll이 윈도우즈 레지스트리에 있는지 확인합니다.
  5. dll을 사용하는 .exe x86이 있는 경우 exe는 x86 모드로 컴파일되어야 합니다.
  6. exe는 C:\Program Files(x86) 폴더에 설치해야 합니다.

이 절차는 유효합니다. 괜찮습니다.

서로 다르지만 유사한 해결책과 관련된 문제가 발생했습니다.

64비트 DLL을 사용하여 Windows 서비스 프로젝트를 "Any-CPU"로 설정했습니다. 같은 오류 메시지입니다.여러 가지 시도를 해봤지만 아무 것도 되지 않았습니다.마지막으로 Properties -> Build 프로젝트에 들어가 보니 "Prefer 32-bit"이 선택되어 있었습니다.이 옵션을 선택하지 않고 더 이상 오류가 발생하지 않습니다.

Windows 서비스에서 32비트 DLL을 예상했지만 찾을 수 없었던 것 같습니다.

x86으로 변경하는 방법

  1. 솔루션에 대한 설정 프로젝트를 만듭니다.
  2. 생성한 후 솔루션 탐색기로 이동하여 설정 프로젝트를 마우스 오른쪽 버튼으로 클릭합니다.
    • 구성 관리자를 누릅니다.
    • "Active Solution Platform" 콤보 상자를 클릭하고 New(x86이 표시되지 않는 경우)를 선택합니다.
    • 첫 번째 콤보 x86에서 선택한 다음 확인을 누릅니다.
    • 설치 프로젝트를 재구성한 다음 모든 프로젝트를 재구성합니다.

웹 사이트를 실행 중인 경우 응용 프로그램 풀에서 32비트 응용 프로그램을 사용하지 않도록 설정할 수도 있습니다(풀의 고급 설정).

저는 DLL의 실제 등록과 관련된 문제를 발견했습니다.

  • CMD 프롬프트에서 "Regedit.exe"를 먼저 실행합니다("만약을 위해" 보안 수준을 Administrator로 높였습니다).
  • 그런 다음 RegEdit 메뉴에서 "Edit/Find"를 클릭하거나 COM 클래스 팩토리와 관련하여 수신한 오류 메시지에 표시되는 CLSID를 레지스트리에서 검색합니다.나의 CLSID는 29.AB7A12-B531-450E-8F7A-EA94C2F3C05F.
  • 이 키를 찾으면 하이브 노드 아래의 "InProcServer2" 하위 키를 선택하고 오른쪽 Regedit 프레임에서 문제 DLL의 파일 이름을 확인합니다.기본값 아래에 표시됩니다.
  • 해당 파일이 "C:"에 있는 경우\Windows\SysWow64(예: C:\Windows\SysWow64\Redemption.dll)을 사용하는 것이 중요합니다.\Windows\SysWow64\RegSvr32.exe" 파일을 기본 "C:"가 아닌 명령줄에서 해당 DLL을 등록합니다.\Windows\System32\RegSvr32.exe" 파일입니다.
  • 그래서 CMD 프롬프트를 실행하고(이 수준이 필요한 경우를 대비하여) 명령줄(DLL의 경우) C:\Windows\SysWow64\RegSvr32.exe:\Windows\SysWow64\Redemption.dll을 입력합니다.
  • "종료"를 통해 명령 창을 닫은 다음 컴퓨터를 다시 시작합니다. (항상 Close Down 대신 재시작을 사용하고 시작합니다. (이상하게도) "종료" 및 "전원 켜기"는 저장된 드라이버 및 기타 값을 다시 로드하는 동안 모든 항목을 완전히 종료하고 다시 시작합니다.
  • 나중에 DLL을 등록할 때마다 C:에 저장된 모든 DLL에 대해 SysWow64 "RegSvr32.exe"를 사용해야 합니다.\Windows\SysWow64 폴더 및 이 문제 c(잘못된 등록으로 인해 발생한 경우)는 다시 발생하지 않아야 합니다.

개인적인 경우 개발자 컴퓨터의 Windows 레지스트리에서 클래스 ID를 검색하는 문제가 해결되었습니다(문제가 클라이언트 PC에 발생했기 때문).이 작업은 문제의 원인이 되는 COM 구성 요소인 my에서 참조되는 x86 라이브러리에 배치됩니다.설치 프로그램 또는 업데이트 프로그램에 대해 OCX/COM으로 등록되지 않은 NET 프로젝트입니다.

안부 전해요

VSTO를 사용하는 모든 사용자에게 문제는 다음에 대한 누락된 참조였습니다.office집회의특정 VSTO 개체를 수동으로 인스턴스화하려는 경우에도 나타납니다.

제 문제는 제 프로젝트 References에서 MS Sync FrameWork 버전(1.0)이 잘못되었다는 것입니다.버전 2.1로 업데이트한 후 오류가 사라졌고 삶이 다시 좋아졌습니다.

저의 경우, 저는 다음과 같은 ms office 파일을 생산하고 있습니다.word또는excel나는 달립니다Win+R실행dcomcnfgDCOM 구성에서 OFFICE 관련 이름 항목을 선택합니다(예: 이름에 포함됨).Excel또는Word또는Office) 및Open the properties, select Identity tab and select the interactive user.이 대답대로,

오류 메시지 표시CLSID {000209FF-0000-0000-C000-000000000046}그래서 나는 DCOM Config에서 이 특정한 CLSID를 찾으려고 노력해야 하고, 그것은 존재하고, 나는 그것을 선택하고 같은 단계를 따릅니다.interactive user그러면 작동합니다.

수락된 답변, 대상 플랫폼을 x86으로 변경하는 것은 경우에 따라 작동하지 않았습니다!

비주얼 스튜디오용 수정 보고서를 설치했을 때, 수정 보고서 런타임 엔진(64비트)이 작동했습니다!

다른 사람들은 32비트와 64비트 런타임 엔진을 모두 설치하면 이 문제가 해결될 수 있다고 제안합니다!

한 번 해보세요!

여기에 이미지 설명 입력

언급URL : https://stackoverflow.com/questions/1036856/retrieving-the-com-class-factory-for-component-with-clsid-xxxx-failed-due-to-t

반응형