2010-05-10 3 views
0

우리는 중첩 된 구조를 일부 장치 드라이버의 인터페이스로 사용합니다. 때때로 개별 요소를 업데이트해야합니다. '주소'연산자가 유용 할 수 있지만 '오프셋'함수 나 연산자는 내가 실제로 찾고있는 것이지만 어떻게 할 것인지 잘 모르겠습니다. 즉, structureN.elementX가 구조의 시작 부분에서 얼마나 떨어져 있는지를 바이트 단위로 나타 냅니까?
거기에 'Address of'또는 .net의 오프셋 연산자와 같은 것이 있습니까?

[StructLayout(LayoutKind.Sequential)] 
public struct s1 
{ 
    UInt16 elem1; 
    UInt16 elem2; 
    UInt16 elem3; 
} 

[StructLayout(LayoutKind.Sequential)] 
public struct s2 
{ 
    UInt16 elem1; 
    UInt16 elem2; 
    UInt16 elem3; 
} 

[StructLayout(LayoutKind.Sequential)] 
public struct driver 
{ 
    public S1 s1; 
    public S2 s2; 
} 

는 예를 들어 우리는 오프셋 어드레스, 데이터 블록 길이를 제공하는 방법으로, driver.s1.elem3를 업데이트 장치 드라이버 일부 데이터를 전송해야한다. 로컬 복사본을 업데이트 한 다음 앞서 언급 한 데이터로 장치 API를 호출합니다. 안전하지 않은 메소드 호출로이 작업을 수행해야하는지 확신 할 수 없습니다. 어떤 도움이 필요합니까?

+1

확실히 관리되지 않는 코드에서 수행해야하는 작업처럼 들립니다. 이것은 일종의 것입니다 .Net은 도망 가야했습니다. – tloflin

+4

다른 7 개의 질문에 대한 답변이 만족스럽지 않으십니까? –

+0

이해하지만 장치 드라이버 사람들은이 방법으로 UI를 사용하기를 원합니다. 그것은 결코 쉬운 일이 아닙니다. ... – Gio

답변

0

이 구현을보다 적절한 구성 요소로 추상화하려면 장치 및 사용자 인터페이스 개발자와의 협력을 고려하십시오.

장치 드라이버와 같은 낮은 수준의 방식으로 직접 상호 작용하는 UI는 유지 관리, 테스트 및 생성하기가 어렵습니다 (분명히 AddressOf는 이미 문제가 아닙니다 .-)).

UI 프로젝트/응용 프로그램 (.NET)으로 구조 조정을 한 다음 p/invoke 할 수있는 관리되지 않는 라이브러리 나 COM을 사용하여 장치 드라이버가 작동하는지 여부를 확인하거나 관리되는 .NET C++은 당신을 그 길의 일부로 만들 수 있습니다.

질문에 직접 답변하지 않아서 불편을 끼쳐 드려 죄송합니다. 기술적 인 답변보다이 경우에 앱 아키텍처 변경이 더 중요 할 수 있습니다.

관련 문제