2009-07-06 3 views
0

Windows 7 64 비트에서 ITaskBarList3에서 CoCreateInstance가 실패하는 이유는 누구나 알 수 있습니까? 오류 코드는 등록되지 않은 클래스 인 0x80040154입니다.CoCreateInstance가 ITaskBarList3에서 0x80040154와 함께 실패합니다.

호출 코드 (VB6)입니다 : CLSIDFromString 및 IIDFromString에서

Public Const IID_ITaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" 
Public Const CLSID_TaskbarList3 = "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}" 

'.... 

Dim IID As GUID_API 
Dim CLSID As GUID_API 

Dim iTaskBarVB3 As ShellLib.ITaskbarList3 

rc = CLSIDFromString(StrPtr(CLSID_TaskbarList3), CLSID) 
rc = IIDFromString(StrPtr(IID_ITaskbarList3), IID) 
rc = CoCreateInstance(CLSID, 0, CLSCTX_SERVER, IID, iTaskBarVB3) 

수익률이 모두 0 (성공)입니다. 레지스트리에서 문자열을 찾을 수 있습니다. 내 작업 표시 줄이 분명히 잘 작동하고 있기 때문에 인터페이스가 다른 프로세스에서 제대로 호출 할 수 있다는 것을 알고 있습니다.

ITaskBarList3은 mktyplib.exe를 사용하여 컴파일 된 형식 라이브러리에서 선언됩니다. GUID 값을 두 번 확인했는데 SDK에있는 값과 일치합니다.

도움을 주시면 감사하겠습니다.

+0

클래스 ID가 인터페이스 ID와 같지 않은 것을 본 적이 없습니다. 어쩌면 한 번씩 작동 할 수도 있지만 일반적으로 다를 수 있습니다. – sharptooth

+0

@sharptooth : 나는 둘 다 똑같이 본 적이 없다.그러나 IMO는 둘 다 레지스트리의 서로 다른 섹션을 가지고 있기 때문에 작동 할 수 있습니다. 둘 다에 대한 조회가 별도의 장소에 있기 때문에 가능합니다. 그런 말로하면 안된다. 그러나 이것이 왜 효과가 없을지 궁금하다. – Aamir

+0

나는 그것이 효과가있을 것이라고 추측하지만 그러한 코드를 보는 것은 매우 의심 스럽다. – sharptooth

답변

0

ClassID는 문제가 아니 었습니다. 일주일 전에 올바르게 작동했기 때문입니다. 이전에 32 비트 Windows Vista에서 컴파일하고있었습니다.

이제 시스템을 Windows 7, 64-bit로 업데이트했습니다. 문제는 32/64 비트 호환성 문제가 아닙니다. TaskBar는 Wow64를 통해 액세스 할 수 있으며 32 비트 ATL DLL에서 인터페이스를 호출 할 수 있습니다.

검색을 좀 더했는데 64 비트 창에서 actxprxy.dll 문제에 관한 웹 참조가 많이 있습니다. 이 DLL은 OLE 뷰어에 따라 인터페이스가있는 것처럼 보입니다.

어쨌든 일부 사람들은 .reg 스크립트의 다양한 조합과 파일 등록 취소/재 등록과 함께 운이 좋았습니다. 불행히도, 나는 그 사람들 중 하나가 아닙니다.

나는 두통을 덜어 주기로 결정했으며, ATL을 사용하여 작은 DLL을 작성했으며 VB 코드를 호출했다. 해당 설정에서 잘 작동합니다 ...

다시 도움 주셔서 감사합니다.

4

가장 큰 이유는 호출 코드가 32 비트이고 COM 서버가 64 비트이므로 in-proc 서버로로드 할 수 없다는 것입니다.

가능한 해결 방법은 COM 서버가 out-proc 서버로 강제 생성되도록 COM + 응용 프로그램을 만드는 것일 수 있습니다. 그러나 COM 서버가 ActiveX 컨트롤을 제공하려는 경우에는이 방법이 도움이되지 않습니다.

클래스 ID가 인터페이스 ID와 동일하다는 사실에 놀랐습니다. 인터페이스 ID와 다른 점은 놀랍습니다. 당신은 그 인터페이스를 구현하는 컴포넌트의 개발자가 아니고 오직 소비자 만이 클래스 ID를 인터페이스 ID로 잘못 배치했기 때문에 이것이 클라이언트 프로그램이 작동하지 않는 이유입니다. ITaskBarList3 인터페이스를 구현하는 클래스의 클래스 ID를 찾아 클래스 ID로 사용해야합니다.

1

CLSID_TaskbarList3가 존재하지 않습니다! 단순히 CLSID_TaskbarList = "{56FDF344-FD6D-11D0-958A-006097C9A090}"이며 IID_TaskbarList3 IID와는 다른 GUID를 가지고 있습니다.

COM에서 일반적으로 하나 이상의 인터페이스를 구현하는 하나의 클래스가 있습니다. 일반적으로 모든 인터페이스에 대해 새로운 클래스가 존재하지는 않습니다.

관련 문제