(연관된 글이 1개 있습니다.)
                    
                    
                    안녕하세요.
좀 오래된 이미지 그래버 보드를 C#에서 사용하려고 합니다.
보드는 DLL 형태로 드라이버를 제공하는데
Init함수를 호출하면 보드에서 사용할 버퍼의 메모리 주소를 리턴하고
Scan을 시작하면 위 주소부터 이미지 데이터를 쓰게 됩니다.
C++에서는 다음과 같이 사용하면 동작합니다.
extern "C" __declspec(dllimport) bool OpenPCI(DWORD **RAM);
    pOpen = (DLL_Open)GetProcAddress(hdll, "OpenPCI");
    HMODULE hdll = LoadLibrary(L"aa.dll");
DWORD* RAMPCI;
    pOpen(&RAMPCI);
 ...
    DWORD data[i] = RAMPCI[i];
...
이를 C#으로 바꾸고자 해서 다음과 같이 
        [DllImport("aa.dll", CallingConvention = CallingConvention.Cdecl)]
        public static extern bool OpenPCI(ref IntPtr pVRAM);
        IntPtr pVRAM = IntPtr.Zero;
        bool res = OpenPCI(ref pVRAM);       // 
...
        Marshal.Copy(pVRAM, linebuff, 0, Length);       // 1 line read
코드를 작성했는데 컴파일 에러는 없이 동작은 하나 주소가 맞는지 알 수 없습니다. 
실행해 보면 Marshal.Copy 수행 중에 보호된 메모리를 참조한다는 오류가 발생합니다.
디버거에서는 Open시 시그니처 오류로 스택이 불안정 해진다는 메세지가 나옵니다.
질문 : C++에서 RAMPCI 포인터의 주소를 인자로 보내면 버퍼 메모리 주소를 포인터의 값에 넣어 주는데
  C#에서 IntPtr의 주소를 갖는 포인터를 또 만들 수 있는지, 위의 코드처럼 ref pVRAM 으로 직접 받아 오면
  어떤 값이 리턴되어 오는지 궁금합니다.
        
        [연관 글]
                    
                    
                    
                    
                    
    
                    
                    
                    
                    
                    
                
                    [최초 등록일: ]
                    [최종 수정일: 10/27/2023]