在Vs2005 中MFC写的视频采集卡程序,采集视频信息。现在是想在其它程序中直接调用VC++ DLL 达到输入设备ID(主要是因为可能用到多张采集卡,每张采集卡中有四个通道)和设备通道后采集该通道一张图片的功能,而MFC中程序始终有一个窗口是连接设备的,如何才能实现?也就是把带有窗口连接设备的应用程序弄成DLL,实现单纯的得到一张图片的功能。部分源码// CSDK3000Dlg 消息处理程序BOOL CSDK3000Dlg::OnInitDialog()
{
CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
if(VCAInitSdk()!=S_OK)
{
::AfxMessageBox(_T("VC404卡驱动初始化失败!"));
return FALSE;
}
VCAGetDevNum(&m_nDevNum);
if(!m_nDevNum)
{
::AfxMessageBox(_T("请确定VC404卡驱动程序是否安装成功!"));
return FALSE;
}
g_dwDevNum=m_nDevNum; if(!CreateWindowClass())
{
::AfxMessageBox(_T("系统初始化错误!"));
return FALSE;
}
m_pDev = new DEVICE_INFO[m_nDevNum];
g_pStatus = new GRAPH_STATE[m_nDevNum]; if(!m_pDev)
{
::AfxMessageBox("系统初始化错误!");
return FALSE ;
} m_pColorSaveFile = new CFile("ColorSaveFile.dat",CFile::modeReadWrite); ::GetWindowRect(m_conShowWin.m_hWnd,&g_rcShowWin); this->GetWindowRect(&g_rcMainWin); g_rcFullScreen.right = GetSystemMetrics(SM_CXSCREEN);
g_rcFullScreen.bottom=GetSystemMetrics(SM_CYSCREEN); Init();
LoadData();
m_bOdd = FALSE;
m_bEvent = FALSE; // g_pvideoDlg = new CVideoDlg;
// g_pvideoDlg->Create(IDD_DIALOG_VIDEO, NULL); m_conDevID.SetCurSel(0); g_pDev = m_pDev;
m_dwDevID = 0;
g_dwCard = m_dwDevID; //m_pIoMotionDlg = new CIoMotionDlg;
//m_pIoMotionDlg->m_pDev = m_pDev;
//BOOL bResult = m_pIoMotionDlg->Create( IDD_IO_MOTION_DIALOG, NULL );
//ASSERT (bResult ); m_comVidSwitch.InsertString( 0, "VIDEO通道1" );
m_comVidSwitch.InsertString( 1, "VIDEO通道2" );
m_comVidSwitch.InsertString( 2, "VIDEO通道3" );
m_comVidSwitch.InsertString( 3, "VIDEO通道4" );
m_comVidSwitch.InsertString( 4, "SVIDEO通道1" );
m_comVidSwitch.SetCurSel( m_pDev[g_dwCard].m_cnVidSwitch ); //m_OsdSnap.Create(this);
//m_OsdSnap.SetTextColor(RGB(0, 0, 255));//Default Color //m_OsdDetect.Create(this);
//m_OsdDetect.SetTextColor(RGB(0,255,0));//Default Color //g_OsdTrack.Create(this);
//g_OsdTrack.SetTextColor(RGB(0,255,0)); for(int dwCard = 0; dwCard < m_nDevNum; dwCard++)
{
// VCADisConnectDevice(dwCard);
VCASetTextOSD(
dwCard,
m_pDev[dwCard].stuOSDPARAM[0].cfEnableOSD,
m_pDev[dwCard].stuOSDPARAM[0].cfText,
m_pDev[dwCard].stuOSDPARAM[0].cfTopLeft,
m_pDev[dwCard].stuOSDPARAM[0].cfTransparent,
&m_pDev[dwCard].stuOSDPARAM[0].OSDParam,
m_pDev[dwCard].hWnd);
VCASetDateTimeOSD(
dwCard,
m_pDev[dwCard].stuOSDPARAM[1].cfEnableOSD,
m_pDev[dwCard].stuOSDPARAM[1].cfTopLeft,
m_pDev[dwCard].stuOSDPARAM[1].cfTransparent,
&m_pDev[dwCard].stuOSDPARAM[1].OSDParam,
m_pDev[dwCard].hWnd);
/* CSize szVidSize;
szVidSize.cx = m_pDev[dwCard].dwCapWeight;
szVidSize.cy = m_pDev[dwCard].dwCapHeight; if ( dwCard == 0 )
{
m_pDev[dwCard].bOpen = ( VCAConnectDevice( dwCard,
TRUE, m_pDev[dwCard].hWnd,
szVidSize, m_pDev[dwCard].m_cnVidSwitch,
25, VideoSubType_YUY2 ) == S_OK );
}
else
{
m_pDev[dwCard].bOpen = ( VCAConnectDevice( dwCard,
FALSE, m_pDev[dwCard].hWnd,
szVidSize, m_pDev[dwCard].m_cnVidSwitch,
25, VideoSubType_YUY2 ) == S_OK );
}
if(!m_pDev[dwCard].bOpen)
{
CString strTemp;
strTemp.Format( "设备%d捕获参数信息错误!", dwCard );
::AfxMessageBox( strTemp );
}
*/
} CalcularImageRect(); return TRUE; // return TRUE unless you set the focus to a control return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
{
CDialog::OnInitDialog(); // 将“关于...”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
} // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动
// 执行此操作
SetIcon(m_hIcon, TRUE); // 设置大图标
SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码
if(VCAInitSdk()!=S_OK)
{
::AfxMessageBox(_T("VC404卡驱动初始化失败!"));
return FALSE;
}
VCAGetDevNum(&m_nDevNum);
if(!m_nDevNum)
{
::AfxMessageBox(_T("请确定VC404卡驱动程序是否安装成功!"));
return FALSE;
}
g_dwDevNum=m_nDevNum; if(!CreateWindowClass())
{
::AfxMessageBox(_T("系统初始化错误!"));
return FALSE;
}
m_pDev = new DEVICE_INFO[m_nDevNum];
g_pStatus = new GRAPH_STATE[m_nDevNum]; if(!m_pDev)
{
::AfxMessageBox("系统初始化错误!");
return FALSE ;
} m_pColorSaveFile = new CFile("ColorSaveFile.dat",CFile::modeReadWrite); ::GetWindowRect(m_conShowWin.m_hWnd,&g_rcShowWin); this->GetWindowRect(&g_rcMainWin); g_rcFullScreen.right = GetSystemMetrics(SM_CXSCREEN);
g_rcFullScreen.bottom=GetSystemMetrics(SM_CYSCREEN); Init();
LoadData();
m_bOdd = FALSE;
m_bEvent = FALSE; // g_pvideoDlg = new CVideoDlg;
// g_pvideoDlg->Create(IDD_DIALOG_VIDEO, NULL); m_conDevID.SetCurSel(0); g_pDev = m_pDev;
m_dwDevID = 0;
g_dwCard = m_dwDevID; //m_pIoMotionDlg = new CIoMotionDlg;
//m_pIoMotionDlg->m_pDev = m_pDev;
//BOOL bResult = m_pIoMotionDlg->Create( IDD_IO_MOTION_DIALOG, NULL );
//ASSERT (bResult ); m_comVidSwitch.InsertString( 0, "VIDEO通道1" );
m_comVidSwitch.InsertString( 1, "VIDEO通道2" );
m_comVidSwitch.InsertString( 2, "VIDEO通道3" );
m_comVidSwitch.InsertString( 3, "VIDEO通道4" );
m_comVidSwitch.InsertString( 4, "SVIDEO通道1" );
m_comVidSwitch.SetCurSel( m_pDev[g_dwCard].m_cnVidSwitch ); //m_OsdSnap.Create(this);
//m_OsdSnap.SetTextColor(RGB(0, 0, 255));//Default Color //m_OsdDetect.Create(this);
//m_OsdDetect.SetTextColor(RGB(0,255,0));//Default Color //g_OsdTrack.Create(this);
//g_OsdTrack.SetTextColor(RGB(0,255,0)); for(int dwCard = 0; dwCard < m_nDevNum; dwCard++)
{
// VCADisConnectDevice(dwCard);
VCASetTextOSD(
dwCard,
m_pDev[dwCard].stuOSDPARAM[0].cfEnableOSD,
m_pDev[dwCard].stuOSDPARAM[0].cfText,
m_pDev[dwCard].stuOSDPARAM[0].cfTopLeft,
m_pDev[dwCard].stuOSDPARAM[0].cfTransparent,
&m_pDev[dwCard].stuOSDPARAM[0].OSDParam,
m_pDev[dwCard].hWnd);
VCASetDateTimeOSD(
dwCard,
m_pDev[dwCard].stuOSDPARAM[1].cfEnableOSD,
m_pDev[dwCard].stuOSDPARAM[1].cfTopLeft,
m_pDev[dwCard].stuOSDPARAM[1].cfTransparent,
&m_pDev[dwCard].stuOSDPARAM[1].OSDParam,
m_pDev[dwCard].hWnd);
/* CSize szVidSize;
szVidSize.cx = m_pDev[dwCard].dwCapWeight;
szVidSize.cy = m_pDev[dwCard].dwCapHeight; if ( dwCard == 0 )
{
m_pDev[dwCard].bOpen = ( VCAConnectDevice( dwCard,
TRUE, m_pDev[dwCard].hWnd,
szVidSize, m_pDev[dwCard].m_cnVidSwitch,
25, VideoSubType_YUY2 ) == S_OK );
}
else
{
m_pDev[dwCard].bOpen = ( VCAConnectDevice( dwCard,
FALSE, m_pDev[dwCard].hWnd,
szVidSize, m_pDev[dwCard].m_cnVidSwitch,
25, VideoSubType_YUY2 ) == S_OK );
}
if(!m_pDev[dwCard].bOpen)
{
CString strTemp;
strTemp.Format( "设备%d捕获参数信息错误!", dwCard );
::AfxMessageBox( strTemp );
}
*/
} CalcularImageRect(); return TRUE; // return TRUE unless you set the focus to a control return TRUE; // 除非将焦点设置到控件,否则返回 TRUE
}
AfxSetResourceHandle(dll的实例
)
按照常理来讲肯定可以把界面的东西封装到DLL中的,要不然微软底层就那么一些DLL
其实主要是想把MFC窗口程序封装成为DLL,也就是不需要知道执行过程,DLL中提供参数初始化相关参数接口,选取选用的SDK卡的编号接口,选取SDK通道接口,接着就是调用得到图片接口,最后当用户关闭自己的程序的时候释放相应的资源接口。主要的问题原先的MFC程序是有界面的,并且通讯的设备始终和界面或者说是执行程序是相关连的,且参数初始后始终是有保存在内存中的,并动态的修改的,不知道DLL具不具有始终与设备通讯连接并保存视频的相关参数,或者是视频流等信息功能,这方面的还真的没弄过,不直到那位大侠能否确认一下用DLL可是实现与设备通讯,保存相关数据的功能吗?