Vista 지 엄격하의 검사 인터페이스 Id DCOM 니다.(스텁 받은 나쁜 데이터)?

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

  •  09-06-2019
  •  | 
  •  

문제

난 모든 사람을 용서해 주실 것입니다 길이,그리고 이야기,패션의 이 질문입니다.결정을 설명하는 상황에서 일부 세부 사항에서 내 블로그입니다.나중에 본 조엘의 초대한 이 사이트,그리고 나는 그것을 붙여 여기에 보면 사람이 어떤 상황으로 통찰력.

쓰고 지원하고,응용 프로그램으로 구성된 시각 기본적인 두꺼운 클라이언트를 말하 DCOM 하는 중간 계층 COM+서 작성한 구성 요소를 사용하여 C++에 ATL.에서 실행되는 모든 여덟 명의 사무소.각 사무 호스트를 백-엔드 서버에 포함된 COM+응용 프로그램(로 구성된 18 구)및 SQLServer.SQLServer 에서 일반적으로 동일한 백엔드 서버,하지만하지 않아야 합니다.

우리는 최근 마이그레이션 백엔드 서버에서 우리의 가장 큰 사무실--뉴욕에서 MSC 클러스터의 새로운 가상 컴퓨터에서 호스팅하는 VMWare 의 ESX 기술입니다.부터의 위치 COM+응용 프로그램에서 서버를 새로운 하나,다른 이름으로 나는 리디렉션하는 모든 클라이언트들을 활성화 COM+응용 프로그램에서는 새로운 서버입니다.절차는 오래된 모자라 내가 기본적으로 같은 일을 위해 여러 가지 내 작은 사무실을 통해 갔다 하는 유사한 인프라를 업그레이드.

모든 일상적인 듯하고 월요일 아침에 사무실 자체--약 1,000Windows XP 의 워크스테이션--었을 실행하지 않고 사건에 새로운 서버입니다.하지만 그 통화에서 왔는지 내 모바일 그룹이 있는 변호사에서 일하고 집으로 VPN 연결을 얻고 있었다는 이상한 후 오류로 리디렉션하는 새로운 서버

Error on FillTreeView2 - The stub received bad data.

Huh?나는 본 적이 없었다 이 오류 메시지가 전입니다.었는 새로운 서버?그러나 모든 워크스테이션에 사무실에서 작동했다.내가 말한 모바일 그룹 전환하는 변호사를 끊(는 여전히 최고),오류가 사라졌습니다.그래서 차이점은 무엇입니까?이 변호사는 실 Vista 집에 있습니다.

우리는 실행되지 않 비스타에서 우리 사무실의,하지만 우리는 몇 가지 변호사를 실행하는 Vista 집에(물론에서 나는 뉴욕 office).내가 할 뿐만 아니라 나는 본 적이 이 문제를 해결합니다.가 있는지 확인하기 위해 문제,나는 내 Vista 노트북,뾰족하는 새로운 서버와 같은 오류가 있습니다.나는 지적이드 서버에 있습니다.분명 문제가 있으로 Vista 및 부품에 새로운 서버는 문제에 영향을 미치는 것을 보이지 않았습 XP 클라이언트입니다.그것은 무엇을 할 수 있을까?

다음 정지-응용 프로그램의 오류 로그에 나 노트북입니다.이 나왔고 더 많은 정보에 오류가:

Source:        Microsoft-Windows-RPC-Events
Date:          9/2/2008 11:56:07 AM
Event ID:      10
Level:         Error
Computer:      DevLaptop
Description:   Application has failed to complete a COM call because an incorrect
interface ID was passed as a parameter.

The expected Interface ID was 00000555-0000-0010-8000-00aa006d2ea4, 
The Interface ID returned was 00000556-0000-0010-8000-00aa006d2ea4.

User Action - Contact the application vendor for updated version of the application.

인터페이스 id 를 제공하는 실마리가 필요한의 신비를 풀어.는"예상되는"인터페이스 id 식별 MDAC 의 레코드 인터페이스로 버전 2.1 의 인터페이스입니다.하"반품"인터페이스에 해당 하는 이후 버전의 레코드 집합(2.5 버전과 다른 버전 2.1 의 포함에 의해 하나의 추가 항목의 끝에서 vtable--저장 방법).

참으로 나의 구성요소의 인터페이스에 노출시키는 많은 방법을 레코드 집합을 통과 출력 매개 변수입니다.그래서 그들은 갑자기 돌아온 이후 버전의 레코드 집합을--서로 다른 인터페이스 id?그것은 확실히 나타났다.그리고 나는 생각해야하는 이유,그것은 문제입니다.이 vtable 같이 클라이언트의 인터페이스입니다.실제로 제가 생각하는 경우 우리는 이야기에 대한 프로세스 COM 지,DCOM,이것은 분명히 무해한 임피던스 불일치되었을 것이 자동으로 무시되며 발생할 수 있습니다.

물론,프로세스 및 기계으로 플레이,추가된 지시어 스텁 사이의 클라이언트와 서버입니다.이 경우에는,내가 사용 유형은 라이브러리 마샬링와 자유 스레드 마샬러.그래서 거기에는 두 개의 신비를 해결하기:

왜 나는 반환하는 다양한 인터페이스에서 출력에서 매개변수 방법을 내 새로운 서버?

왜 이런 짓만 영향을 미치 Vista 클라이언트가 있는가?

으로 서버 소프트웨어에 호스팅 서버는 각각의 여덟 사무실을 시도하기로 결정했을 가리키는 내 Vista 클라이언트에서 순서에 그들 모두는 문제가 있었 Vista 고는 하지 않았다.조명 테스트입니다.일부의 이전 서버는 여전히 함께 일 Vista 지만 새로운 것들이지 않았다.하지만 일부의 이전 서버가 계속 실행 Windows2000 년 동안 새로운 것에서 2003 년에는 보이지 않았을 것이 문제입니다.

비교 후의 날짜 구성 요소 Dll 을 등장할 때마다 클라이언트는 지적 서버와 함께 구성 요소 Dll 을 발표하기 전에 2003Vista 습니다.하지만 그는 Dll 날짜 후 2003 었는 문제입니다.그것을 믿거나,없었(또는 적어도 상당한)변경 코드 서버에서 구성 요소에서 많은 년이다.분명히 다른 날짜가 단순히 인해 다시 컴파일의 구성요소에서 개발 machine(s).그 중 하나는 사람들이 다시 컴파일에서 일어난 2003.

전구에 갔다.통과하면 레코드 뒤에 서버 클라이언트,내 ATL C++구성 요소를 참조로 인터페이스 _Recordset.이 기호에서 온 유형에 포함된 라이브러리 msado15.dll.이 라인에서는 C++코드:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" no_namespace rename ( "EOF", "adoEOF" )

속이지 않으로 15msdad15.dll.분명히 이 DLL 변경되지 않은 이름에서 오랜 시리즈의 MDAC 버전입니다.

When I 응용 프로그램 컴파일,하루에 다시 MDAC 버전 2.1.그래서 _Recordset 으로 컴파일 2.1id 인터페이스와 인터페이스에 의해 반환되는 서버가 실행하는 그 구성 요소입니다.

모든 클라이언트의 사용 COM+응용 프로그램을 생성된 프록시(I believe)back in1999.형식 라이브러리를 정의하는 나의 인터페이스를 포함한 라인:

importlib("msado21.tlb");

이유를 설명하는 그들이 예 버전 2.1 의 레코드 집합을 내에서 방법을 출력 매개 변수입니다.문제를 명확하게 내 2003 다시 컴파일하고는 사실에는 _Recordset 상징이 없습니 맞 버전 2.1.실제로 _Recordset 에 맞 2.5 버전의 독특한 인터페이스 id.에 대한 솔루션이었을 변경에서 모든 참조 _Recordset 을 Recordset21 내 C++코드입니다.내가 다시 구성 요소 및 배포하는 새로운 서버입니다.Voila--클라이언트는 것 같았습니다.

결론적으로,두 가지 질문을 잔소리는 남아 있습니다.

왜 이 프록시/스텁 인프라의 것과 다르게 행동하 Vista 클라이언트가 있는가?그것은 나타납니다 Vista 은 엄격한 검사를 인터페이스의 id 에서 돌아 오는 방법을 매개 변수보다는 XP.

어떻게 코딩이 다르게 1999 년에 다시는 이런 일이 일어나지 않았을 거야?인터페이스가 될 예정이 변경할 수 없을 때 저는 다시 컴파일에서의 최신 버전깅 메뉴 나는 실수로 변경 내 인터페이스 때문에 이 방법을 지금은 반환되는 다른 레코드 인터페이스의 출력으로 매개 변수입니다.내가 알기로는 형식 라이브러리를 다시 있지 않았다에 버전 특유의 기호는 나중에 버전의 MDAC 형식 라이브러리를 정의 Recordset21 지만,그 기호를 사용할 수 없었던 다시 2.1 형식 라이브러리입니다.

도움이 되었습니까?

해결책

면 Microsoft 가지고 보안교,DCOM(기본 RPC)많은 관심을 가지고 있는 확실히 변화가 있었 보안 구멍을 닫는 결과에 더 엄격한 마샬링.나는 당신이 볼 수있는 보는 이 비스타에서하지만 XP 에서지만,그것의 가능한 추가적인 검사를 추가한다.또는,그것의 가능한하는 선택적인 엄격 XP 에서 만들어졌에서 필수적입니다.

하지 않는 동안에 대해 충분히 알고 있 MDAC 알고 있을 수 있으면 막을 내가 알고있는 보안이 중 하나의 몇 가지 분야 Microsoft 은 예쁜 기꺼이 희생하는 이전 버전과의 호환성도록 그것은 당신이 할 수 없었 아무것도"좋은"돌아에서는 1999 년에 제정되었습니다.

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