2009-12-10 3 views
1

이라는 것을 알았습니다. 내 바보 P/Invoke 질문 중 또 하나 ... 때로는이 물건이 케이크 조각이 될 것이라고 생각하지만, 그것은 내 얼굴에서 날아갑니다.구조 배열은 아이템을받지 못했지만 그 방법은 그것이

대상 배열을 사용하여 채우는 단순한 관리되지 않는 메서드가 있습니다.

unsigned short NvtlCommon_GetAvailableDevices(SdkHandle session, 
    DeviceDetail * pDev_list, unsigned long * dev_list_size) 

typedef struct 
{ 
    DeviceTechType   eTechnology; 
    DeviceFormFactorType eFormFactor; 
    char     szDescription[NW_MAX_PATH]; 
    char     szPort[NW_MAX_PATH]; 
    char     szFriendlyName[NW_MAX_PATH]; 
} DeviceDetail; 

난 C 번호 이러한 변환 :

[DllImport(NvtlConstants.LIB_CORE, EntryPoint = "NvtlCommon_GetAvailableDevices")] 
public static extern NvtlErrorCode GetAvailableDevices(IntPtr session, 
    DeviceDetail[] pDev_list, ref long dev_list_size); 

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)] 
public struct DeviceDetail { 
    public DeviceTechType eTechnology; 
    public DeviceFormFactorType eFormFactor; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NvtlConstants.NW_MAX_PATH)] 
    public string szDescription; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NvtlConstants.NW_MAX_PATH)] 
    public string szPort; 

    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NvtlConstants.NW_MAX_PATH)] 
    public string szFriendlyName; 
} 

문서 입력시, dev_list_size 할당 된 배열의 크기 여야한다고. 출력시 실제로 채워지는 항목의 수입니다. 인수에 out 또는 ref을 사용하면 응용 프로그램이 충돌합니다. 이것은 심지어 작동하기 시작하는 유일한 서명 인 것 같습니다.

DeviceDetail[] devices = new DeviceDetail[5]; 
long count = 5; 
GetAvailableDevices(coreHandle, devices, ref count); 

그 코드는 성공 메시지를 반환하고 카운트가 가능한 장치의 수는 참으로 인 1로 설정됩니다. 그러나 배열 여전히 초기화되지 않은 DeviceDetail 구조체입니다.

여기에 뭔가 잘못 되었습니까? 아니면 기본 관리되지 않는 라이브러리에 문제가 있습니까?

답변

1

[Out]을 사용해 보셨습니까?

public static extern NvtlErrorCode GetAvailableDevices(IntPtr session, 
    [Out] DeviceDetail[] pDev_list, ref long dev_list_size); 
     ↑ 
+0

그래, 그랬어. 나는 그것이 단순한 무언가 일 줄 알았다. 감사! –