(연관된 글이 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]