在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
}

解决方案 »

  1.   

    和普通使用窗口没什么两样,唯一要注意的你的对话框的资源,是在dll中的,要设置一下资源句柄,否则可能找不到对话框资源.
    AfxSetResourceHandle(dll的实例
    )
      

  2.   

    将资源封装到dll中,其他的类似正常exe
      

  3.   

         我再具体的试试,这方面的还的确没有碰到过,所以弄起来感觉还真的有点麻烦,还得自己多测试测试方法,可能MFC中界面的东西不能封,总有其它的方法解决的!
    按照常理来讲肯定可以把界面的东西封装到DLL中的,要不然微软底层就那么一些DLL
      

  4.   


    其实主要是想把MFC窗口程序封装成为DLL,也就是不需要知道执行过程,DLL中提供参数初始化相关参数接口,选取选用的SDK卡的编号接口,选取SDK通道接口,接着就是调用得到图片接口,最后当用户关闭自己的程序的时候释放相应的资源接口。主要的问题原先的MFC程序是有界面的,并且通讯的设备始终和界面或者说是执行程序是相关连的,且参数初始后始终是有保存在内存中的,并动态的修改的,不知道DLL具不具有始终与设备通讯连接并保存视频的相关参数,或者是视频流等信息功能,这方面的还真的没弄过,不直到那位大侠能否确认一下用DLL可是实现与设备通讯,保存相关数据的功能吗?
      

  5.   

    这个问题一直很苦恼的,我把原先的MFC有窗口的程序该为了DLL但是用其它调用的时候还是不行,不知道问题出在那里啊,而且一般写成DLL的函数相对来说应该功能比较独立点吧?
      

  6.   

      这个问题想一想其实是本身的问题,我想直接封装一个DLL调用得到一张图片,理论上是可行的,主要的是,视频采集的部分是以流的形式和界面交互的,所以按照常规的思路肯定是行不同的,则必须有提供一种直接采集的方法,其实完全可以逻辑的部分写在DLL 中,而界面操作的部分写在程序的表现部分。通过弄此也深深的明白了一个道理,也说明自己在思考等方面存在很大的偏差,多谢朋友们的帮忙,虽然没有能完全解决这个问题,但是还是结了帖子。多谢朋友们的关注!