문제

C# 프로젝트에서 C ++로 작성된 DLL을 사용하고 있습니다. 이 코드를 사용하여 DLL 내에서 기능을 호출 할 수있었습니다.

[DllImport("hidfuncs", EntryPoint = "vm_hid_scan", ExactSpelling = true, CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
        public static extern IntPtr VmHidScan();

이제 사용자 정의 유형 포인터를 조정하는 함수를 호출해야합니다. DLL 레이아웃에 대한 문서는 다음과 같은 기능을합니다.

hid_get_info(int n,PDEV_INFO *pdi)

이 사용자 지정 포인터를 사용하는 방법을 모르겠습니다. 이것은 DLL에 정의되어 있습니까? 그렇다면 C# 프로젝트에서 어떻게 사용할 수 있습니까? 그렇지 않은 경우 C#에 헤더 파일을 포함시켜야합니까? 도움을 주셔서 감사합니다.

도움이 되었습니까?

해결책

"P"접두사가 주어지면 실제 선언은

hid_get_info(int n, DEV_INFO **pdi)

여기서 dev_info는 구조입니다. 이 구조의 선언을 찾아 [structlayout] 속성을 사용하여 C# 코드에 추가해야합니다. 그런 다음 C# 코드에서 이와 같은 기능을 선언합니다.

[DllImport("blah.dll")]
private static extern something hid_get_info(int n, out IntPtr pdi);

구조 값을 얻으려면 Marshal.ptrtostructure ()를 사용하십시오. 바라건대 당신은 구조물을 자유롭게 할 필요가 없으며, 당신은 망가질 것입니다.

두 번째 해석은 "PID"가 Dev_info 구조로 다양한 포인터를 반환한다는 것입니다. "N"인수가 주어지면 다소 가능하며, 이는 기능에 의해 채워 지도록 배열의 요소의 수를 의미 할 수 있습니다. 이 경우 intptr []를 전달하고 "n"을 길이로 설정하십시오.

다른 팁

당신은 만들어야합니다 struct C#에서는 C ++를 반영합니다 PDEV_INFO struct C ++에서.

당신은 신청해야합니다 [StructLayout(LayoutKind.Sequential)] 구조물에 다음 C ++ 구조물 (헤더 파일을 보면)에서 필드를 순서대로 복사하십시오.

그런 다음 쓸 수 있습니다 extern 취하는 방법 struct A로 ref 매개 변수.

나는 안전하게 가정 할 것이다 PDEV_INFO* a DEV_INFO**.

c#에서 이것을 사용하십시오 :

class DEV_INFO
{
    // fields go here
}

static class NativeMethods
{
    [DllImport...]
    public static extern int hid_get_info(int n, ref DEV_INFO pdi);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top