안녕하세요? 성태님.
카메라 한대 사서 프로그래밍중인데요...ㅠㅠ~ dll에 파라미터로 정의된 함수포인터 골치아프네요.
카메라에 첨부된 샘플에는 C++로 아래와 같이 되어있는데...
__declspec(dllimport) MVSTATUS_CODES __stdcall MVStartGrab(HANDLE hCam,int (*StreamCB)(MV_IMAGE_INFO*,long nUserVal),long nUserVal);
...
int StreamCB(MV_IMAGE_INFO *pInfo,long nUserVal)
{
...
return 0;
}
...
void CGCapDlg::OnBnClickedStart()
{
...
MVStartGrab(m_hCam,StreamCB,(long)this);
...
}
흠~~ 위의 코드는 dll의 MVStartGrab함수가 카메라로부터 화상을 읽고 동기에 맞추어 읽은 화상데이터를 사용자에게 넘겨주기 위해 사용자처리루틴(int StreamCB(...))을
함수포인터로 넘겨받는 과정이죠. 일단 MVStartGrab(...)함수가 실행되면 동기에 맞춰 StreamCB가 주기적으로 호출되요.
C#에서 아래와 같이 변환했어요.^^
class Form1
{
...
delegate short StreamCB(ref MV_IMAGE_INFO imageInfo, int nUserVal);
[DllImport("MVGigE.dll")]
public static extern MvStatus MVStartGrab(IntPtr hCam, StreamCB streamCB, int nUserVal);
...
short OnStreamCB(ref MV_IMAGE_INFO info, int nUserVal)
{
...
return 0;
}
...
StreamCB sb;
private void b_CamRun_Click(object sender, EventArgs e)
{
...
sb = OnStreamCB;
MVStartGrab(m_hCam, sb, (int)this.Handle);
...
}
}
나로선 어딘가 틀린데가 없어보이는데 OnStreamCB는 맨 첨 한번밖에 실행안되요.
한번만은 데이터랑 완전하게 받아요.
내보기엔 초기에 넘겨준 함수포인터를 잃어버리는것같은데 왜 그럴까요?
MFC에선 제대로 작동되요. 물론 MFC로 해도 되겠지만 품들여 C#에서 영상처리기반 자작했는데... 꼭 C#으로 돌리고 싶네요.
귀중한 시간 자꾸 앗아서 죄송합니다.
[최초 등록일: ]
[최종 수정일: 11/1/2014]