문제

C ++ (Visual Studio 2010)로 작성된 ATL EXE 서버가 있으며 프록시 스터드 DLL을 병합합니다. 실행 파일은 Windows 7 x86 & x64 용으로 컴파일됩니다. 다음은 두 아키텍처에서 발생합니다.

ATL EXE 서버는 "서버 프로세스"로 작동해야합니다. 즉, 하나의 프로세스 (myAtlserver.exe, 하나만 하나만!) 가야합니다. 컴퓨터 당 많은 클라이언트 (간단하게 유지하자 : 동일한 컴퓨터에서 간단하게 유지하자)가 소비되고 있습니다. 그것의 COM 개체. 서버는 응용 프로그램 상태 (메모리)를 저장하고 모든 클라이언트는 서버의 노출 된 COM 개체를 사용 하여이 Sate를 "공유"해야합니다.

exe 서버는 호스팅 된 객체 중 하나를 만들려면 COM 호출로 호출되므로 시스템이 시작될 때 시작됩니다. 이 호출은 spoolsv.exe 프로세스 (인쇄 스풀러 서비스)에서 시작됩니다. 이로 인해 서버 프로세스가 '시스템'사용자로 실행되도록합니다 (Spoolsv.exe가 '시스템'으로 실행되는 사실로 인해 ').

클라이언트 중 하나가 ATL 서버에서 COM 객체를 만드는 경우 다른 프로세스 (MyAtlserver.exe가 다시 로그인 한 사용자가 로그인 한 사용자)에서 인스턴스화됩니다 (Windows에 로그인 한 사용자로 실행)이므로 응용 프로그램 상태를 "원본 "하나 ( '시스템'에서 실행중인). 두 번째 클라이언트는 로그인 한 사용자 ( "두 번째 one")에 의해 인스턴스화 된 것에 연결됩니다.

웹에서 수많은 포럼을 검색 한 후 다음과 같은 결론을 내릴 수있었습니다.

1) 내 ATL 서버는 ATL :: CatlexeModulet <>에서 상속받은 ATL-Module (VS2010 자동 생성)을 사용합니다. ATL 헤더를 파기하면이 모듈 이이 종류의 사용을위한 올바른 플래그로 ATLCommoduleregisterClassObject를 호출한다고 확신합니다 (DWCLSContext= ClscTX_LOCAL_SERVER, FLAGS= REGCLS_SUSPENDED). 그래서 그것은 이것을 규칙합니다.

2) 시작 -> 실행 -> DCOMCNFG -> DCOM CONFIG -> myATLServer -> 속성 필자는 'Identity'탭에서 "이 사용자"옵션을 설정했습니다 (로컬 관리자 사용자와 함께). '위치'탭에서 '이 컴퓨터에서 응용 프로그램 실행'옵션이 선택되고 회색으로 표시되지 않습니다. 이것은 나를 다시 검색하고 여기에 있습니다 : http://social.technet.microsoft.com/forums/en-us/w7itprosecurity/thread/4f63ee11-e472-40f9-85db-a6b235d7579c . 이 링크는 DCOMCNFG 유틸리티의 x64 버전이 버그 가고 X64 Windows (시작 -> 실행 -> 'mmc comexp.msc / 32')에서 32 비트 버전을 사용해야한다고 설명합니다. 2 개의 시스템에서 확인한 후 (각 컴퓨터에서 '응용 프로그램 실행'옵션이 회색으로 표시되어 있으며 두 가지 모두에서 선택되지 않았 음을 알았습니다.

이 시점에서 나는 완전히 잃어 버렸습니다 (좌절감을 억제하려고 노력하고 있습니다 ... :-)). 나는 올바른 길에 있니? 누구도 전에이 일을 했습니까?

또는 원래 의도 - ATL EXE 서버 "Singled-Processed"를 어떻게 만드는가?

감사합니다!

OMRI

도움이 되었습니까?

해결책

OK ... 그래서 마침내 나는 나 자신에게 대답 할 것입니다 : -)

나는이 문제를 다시 시도하고 (그리고 다시 ...) 해결할 시간을 발견했습니다. 2 개의 다른 새로운 Dev Machines (Win7x86 & Win7x64)를 설정하고 DComcnfg의 32 비트 버전 만 사용한 후 32 비트 (Win7x86)!

"비 작동"기계에 파고, 나는 지옥에 겪었던 것처럼 알아 냈습니다! x64 dev 컴퓨터에서 COM 개체는 코드 파일 (코드 생성 코드)의 값보다 다른 GUID로 등록되었습니다. 어려움을 겪으려면 잘못된 GUID에 등록 된 연결 지점을 사용했습니다. 그게 내가 의미합니다 - 레지스트리의 GUID 값이 올바르지 않았습니다! 지금까지는 이것이 왜 일어 났는지 전혀 모릅니다. 그러나 나는 VS2010의 COM 마법사가 버그가 있는지 확신합니다 (부분 코드를 생성하는 경우, 어떤 ...). / P>

ATL 서버의 모든 관련 레지스트리 키를 수동으로 삭제 한 다음 VS 프로젝트에서 자동 COM 등록을 취소하고 EXE를 exe 자신을 등록했습니다 (% windir % \ syswew64 \ cmd.exe를 사용하여 x64). 콘솔, 네이티브 x64가 아닌).

서버를 수동으로 등록한 후 모든 것이 잘 작동했으며, 예상대로 하나의 프로세스, 여러 클라이언트간에 공유되며 DCOMCNFG 구성 유틸리티에 회색 확인란이 없었습니다.

이 솔루션이 설명되지 않은 틈이 많지만, 그것은 나를 위해 일을 위해 일합니다 (지금 ...).

환호; -)

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