문제

최근에 중단 된 일부 하드웨어를 지원하고 싶습니다. 하드웨어의 드라이버는 일반 32 비트 C DLL입니다. 우리는 소스 코드가 없으며 (법적 이유로) 드라이버를 소집하거나 리버스 엔지니어링하는 데 관심이 없습니다.

하드웨어는 수많은 데이터를 빠르게 보내므로 통신 프로토콜은 매우 효율적이어야합니다.

당사의 소프트웨어는 기본 64 비트 C ++ 앱이지만 32 비트 프로세스를 통해 하드웨어에 액세스하고 싶습니다. 32 비트 및 64 비트 응용 프로그램이 서로 통신 할 수있는 효율적이고 우아한 방법은 무엇입니까 (이상적으로는 새로운 프로토콜을 발명하는 것이 포함되지 않음)?

솔루션은 C/C ++에 있어야합니다.

업데이트 : 여러 응답자가 사용자 모드 또는 커널 모드 드라이버인지 여부를 설명하도록 요청했습니다. 다행히도 사용자 모드 드라이버입니다.

도움이 되었습니까?

해결책

이것이 실제 드라이버 (커널 모드)라면 SOL입니다. Vista X64는 서명되지 않은 드라이버를 설치할 수 없습니다. 이것은 단지 사용자 모드 DLL 일뿐입니다. 표준 IPC 메커니즘을 사용하여 수정을받을 수 있습니다. 파이프, 소켓, 프로그램 외부, 대략 순서 대략. 충분한 데이터를 버퍼링 할 수있는 한 버스 속도에서 모두 작동합니다. 컨텍스트 스위치 오버 헤드가 너무 많이 아프지 않아야합니다.

다른 팁

나는 단지 소켓을 사용합니다. 미래에 필요한 경우 IP를 통해 사용할 수 있으며 하나의 메시징 API에 묶이지 않을 것입니다. 미래에 다른 OS 또는 언어로이를 구현하려면 가능합니다.

이 기사 관심이있을 수 있습니다. 문제를 논의한 다음 COM을 솔루션으로 사용하는 것이 좋습니다. 나는 COM의 열렬한 팬이 아니지만 Windows Universe에서 유비쿼터스를 감안할 때 충분히 효율적 일 수 있습니다. 데이터를 배치 할 수 있도록 솔루션을 설계하려고 할 것입니다 (각 데이터 항목에 대해 하나의 COM 호출을 수행하지 않으려면).

우아한? C ++? DCOM/RPC 호출은 자신에 대한 자신에게 작동하거나 명명 된 파이프를 만들어 두 프로세스 사이에서 대화하는 데 사용할 수 있습니다 (아마도 "cmessage 클래스"또는 무언가를 만들 수 있습니다. X86과 X64 사이의 다른 구조 정렬을 조심하십시오.

운전자가 진정한 운전자로 판명되면 Nobugz가 거의 옳습니다. 훨씬 더 열심히 일해야한다면 완전히 솔이 아닙니다. 한 가지 해결책은 다른 기계 (또는 가상 머신)에 Win32를 설치 한 다음 소켓 (Pyrolistical에서 제안한대로) 또는 UDP 또는 MQ 또는 TIBCO RendezVous (순서대로 매우 높은 처리량을 지원한다고 주장하는 소켓)와 같은 RPC 형태를 사용하는 것입니다. 금융 시장에서 생성 한 데이터의 양을 처리하려면 적어도 그것이 내가 옛날에 기억하는 것입니다).

양쪽에서 공유하는 메모리 매핑 된 파일은 동일한 내용을 갖습니다. OS는이를 수행하기 위해 흥미로운 포인터 작업을 수행해야하지만, 물리적으로 메모리를 복사하지 않는 방식으로 2 개의 뷰를 설정할 수있을 것입니다. 제로 사본은 얻는 것만 큼 좋습니다

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