CLSID {xxxx}로 구성 요소에 대한 COM 클래스 공장 검색 다음 오류로 인해 실패했습니다. 80040154

StackOverflow https://stackoverflow.com/questions/1036856

문제

PDF 보고서를 생성하기 위해 C#.NET을 사용하여 Windows 서비스를 개발했습니다. PDF 파일을 생성하려면 타사 DLL을 사용하고 있습니다. 응용 프로그램은 내 Windows XP 플랫폼에서 실행 중입니다. 서비스를 배치했을 때 Windows Server 2008 64 비트 버전,이 오류가 발생했습니다.

CLSID {46521B1F-0A5B-4871-A4C2-FD5C9276F4C6}로 구성 요소에 대한 COM 클래스 공장 검색은 다음 오류로 인해 실패했습니다. 80040154.

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

문제가 무엇 일 수 있습니까?

도움이 되었습니까?

해결책

vs- 프로젝트 속성 - 빌드 탭에서 - 플랫폼 대상 = x86

다른 팁

서비스가 '모든 CPU'에 대해 구축 된 것처럼 들리므로 COM 구성 요소를 사용하는 64 비트의 오류가 발생합니다. 당신은 그것을 위해 만들어야합니다 x86.

웹 사이트는 아마도 32 비트 프로세스로 실행 중이므로 구성 요소를 사용할 수있는 이유입니다. 솔루션을 구축합니다 x86 서비스가 32 비트로 운영되도록 강요합니다.

나는 매우 비슷한 문제에 부딪쳤다.

64 비트 기계에서 개발중인 웹 애플리케이션 내에서 이전 32 비트 DLL을 사용해야했습니다. 해당 폴더의 regsrv32 버전을 사용하여 32 비트 DLL을 Windows Syswow64 폴더에 등록했습니다.

제 3 자 DLL에 대한 호출은 Visual Studio의 단위 테스트에서 작업했지만 80040154 오류가있는 동일한 시스템에서 IIS에서 호스팅 된 웹 응용 프로그램에서 실패했습니다.

응용 프로그램 풀을 "32 비트 응용 프로그램 활성화"로 변경하면 문제가 해결되었습니다.

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

  • 응용 프로그램 풀을 선택하십시오
  • 앱이 사용하는 풀을 선택하십시오
  • 고급 설정
  • 32 비트 응용 프로그램을 활성화합니다 진실

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

  1. hkey_classes_root wow6432node clsid {Guid} 아래에서 com 객체 안내서를 찾으십시오.
  2. 일단 위치한 새로운 reg_sz (문자열) 값을 추가하십시오. 이름은 Appid 여야하며 데이터는 방금 검색 한 동일한 COM 개체 안내서입니다.
  3. hkey_classes_root wow6432node appid 아래에 새 키를 추가하십시오. 새 키는 COM 개체 안내서와 동일해야합니다.
  4. 방금 추가 한 새 키에서 새 문자열 값을 추가하고 dllSurrogate라고 부릅니다. 값을 비워 두십시오.
  5. hkey_local_machine software classes appid 아래에 새 키를 만듭니다. 다시 새 키는 com 객체의 안내와 동일해야합니다. 이 키에 따라 값을 추가 할 필요가 없습니다.

나는 솔루션에 대한 신용을 얻지 못했지만 우리에게 효과적이었습니다. 자세한 정보 및 기타 의견은 소스 링크를 확인하십시오.

원천: https://techtalk.gfi.com/32bit-object-64bit-environment/

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

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

AppPool Advanced 설정에서 "32 비트 응용 프로그램 = true"를 설정하는 것만 설정하십시오.

그것은 나를 위해 일했다

Windows 2008 서버 X64 용 솔루션은 다음과 같습니다.

  1. 관리자 권한이있는 cmd.exe를 엽니 다.
  2. DLL을 폴더 C : Windows Syswow64에 복사하십시오.
  3. c : windows syswow64에서 regsvr32를 실행하십시오
  4. DLL이 Windows 레지스트리에 있는지 확인하십시오.
  5. DLL을 사용하는 .EXE X86이있는 경우 X86 모드로 EXE를 컴파일해야합니다.
  6. EXE는 폴더 C : Program Files (x86)에 설치해야합니다.

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

다르지만 유사한 수정과 관련된 관련 문제가있었습니다.

64 비트 DLL을 사용하여 Windows 서비스 프로젝트를 "모든 CPU"로 설정했습니다. 동일한 오류 메시지. 많은 것들을 시도했지만 아무것도 효과가 없었습니다. 마지막으로, 프로젝트 속성에 들어갔다 -> 빌드가 프로젝트에 "32 비트 선호"가 확인되었다는 것을 알았습니다. 이것을 확인하지 않고 더 이상 오류가 없습니다.

내 생각에 Windows 서비스는 32 비트 DLL을 기대하고 있으며 찾을 수 없었습니다.

나는 같은 문제가 있었지만 다른 답변은 솔루션의 한 부분 만 제공했습니다.

솔루션은 두 배입니다.

레지스터에서 64 비트를 제거하십시오.

  • C : Windows System32 Regsvr32.exe /u
  • 이것은 다른 폴더에서 DLL을 복사 한 다른 참조를 제거하지 않습니다.

또는

  • hkey_classes_root clsid {......} inprocserver32라는 키를 찾으십시오. 이 키에는 DLL의 파일 이름이 기본값으로 표시됩니다.
  • hkey_classes_root clsid {......} 폴더를 제거했습니다.

32 비트로 등록하십시오.

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

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

x86으로 변경하려면 :

  1. 솔루션에 대한 설정 프로젝트를 만듭니다.
  2. 그것을 만든 후에는 Solution Explorer로 이동하여 설정 프로젝트를 마우스 오른쪽 버튼으로 클릭하십시오.
    • 구성 관리자를 누릅니다.
    • 클릭 : "Active Solution Platform"Combobox 및 New를 선택하십시오 (x86이 표시되지 않은 경우)
    • 첫 번째 콤보 x86에서 선택한 다음 OK를 누릅니다.
    • 설정 프로젝트를 재건 한 다음 모든 프로젝트를 재건하십시오.

웹 사이트를 운영하는 경우 32 비트 응용 프로그램 (풀의 고급 설정에서)을 비활성화하도록 애플리케이션 풀을 설정하려고 시도 할 수도 있습니다.

VSTO를 사용하는 사람이라면 나에게 문제는 누락 된 언급이었습니다. office 집회. 특정 VSTO 객체를 수동으로 인스턴스화하려는 경우에도 나타납니다.

내 개인적인 경우 문제는 개발자 시스템의 Windows 레지스트리에서 클래스 ID를 검색하는 데 고정되었습니다 (문제가 클라이언트 PC에서 발생했기 때문에). 이 조치는 문제를 일으키는 COM 구성 요소에 배치됩니다. 내 .NET 프로젝트에서 참조 된 X86 라이브러리는 OCX/COM으로 등록되지 않았습니다. 설치 프로그램 또는 업데이트 응용 프로그램의 경우.

문안 인사

내 문제는 프로젝트 참조에서 잘못된 MS Sync Framework 버전 (1.0)을 가지고 있다는 것입니다. 버전 2.1로 업데이트 한 후 오류가 사라지고 인생은 다시 좋습니다.

내 문제가 DLL의 실제 등록과 관련이 있음을 알았습니다.

CMD 프롬프트에서 "Regedit.exe"를 첫 번째로 실행합니다 (보안 수준을 관리자에게 "경우에 따라"한 다음 레지스트리를 검색 한 다음 Regedit 메뉴에서 "편집/찾기"를 클릭하여 Ctrl+F를 누르면)를 검색하십시오. COM 클래스 공장과 관련하여받은 오류 메시지에 표시되는 CLSID의 경우. 내 CLSID는 29AB7A12-B531-450E-8F7A-EA94C2F3C05F였습니다. 이 키가 발견되면 해당 하이브 노드 아래에서 하위 키 "Inprocserver2"를 선택하고 오른손 Regedit 프레임의 문제 DLL의 파일 이름을 확인하십시오. "기본값"아래에 표시. 해당 파일이 "c : windows syswow64"(예 : c : windows syswow64 regemption.dll ")에있는 경우"c : windows syswow64 regsvr32.exe "파일을 사용하는 것이 중요합니다. 기본 "c : wind 명령 줄 (DLL의 경우) :C : windows syswow64 regsvr32.exe c : windows syswow64 regemption.dll 프레스가 들어갑니다. 명령 창을 닫습니다 ( "종료"를 통해 재시작 컴퓨터 (이상하게) 재시작을 수행하기 때문에 컴퓨터 (항상 재직 중단 대신 재시작을 사용한 다음 시작한 다음 시작하십시오. 결함). 향후 DLL을 등록 할 때마다 C : Windows Syswow64 폴더에 저장된 DLL에 SYSWOW64 "regsvr32.exe"를 사용해야합니다.이 문제 C (잘못된 등록으로 인해 발생하는 경우) 다시 일어난다.

제 경우에는 MS Office 파일을 생성하고 있습니다. word 또는 excel, 난 달린다 Win+R 그리고 실행 dcomcnfg, DCOM 구성에서, 선택 사무실 관련 이름 항목 외에 (예 : 이름 포함 Excel 또는 Word 또는 Office) 그리고 Open the properties, select Identity tab and select the interactive user. ~처럼 이 답변,

내 오류 메시지가 표시됩니다 CLSID {000209FF-0000-0000-C000-000000000046}, 그래서 나는 DCOM 구성 에서이 특정 CLSID를 찾아야하고, 종료를하고, 그것을 선택하고 같은 단계를 설정합니다. interactive user, 그런 다음 작동합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top