Архитектура Системы Видеонаблюдения
От: shrkn Россия  
Дата: 10.02.06 17:40
Оценка:
Привет Всем!

У меня следующая проблема

Нужно разработать программную архитектуру телевизионной системы видеонаблюдения (далее ТСН).
Есть некий SDK для плат видеозахвата, я решил низкоуровневые операции такие как:
работа с окнами вывода, захват видео, управление ТСН по сети и др. сделать в виде
набора DLL-ок, причем не просто функции экспортировать а классы по фунциональности, ну во первых
потому, что сложилась уже в голове некая иерария классов (типичное ООП проектирование),
а во вторых с ними работать удобнее.

SDK для плат привязано к GDI, и отчасти к MFC ну потому что примерчик который там есть написан
именно с помощью нее. Легче разобраться.

В общем у меня схема такая:
Весь интерфейс пользователя я решил сделать на билдере, а DLL работает напрямую с SDK на VC++ 7,
но вот я сделал DLL и передаю одному из методов класса хендл на окно, а в методе инициализация
окна по этому хэндлу через GDI, но вот косяк не работают эти функции в DLL не рисуют и все

Но вот если я линкую DLL с приложением на том же VC++ 7 MFC 7 все работает. Причем это с GDI такие проблемы
а вообще MFC код работает нормально (я вставлял в DLL код CFile(...); все работает а вот GetDC();...
не хотят. Ниже приведу как я это делал.

Сделал я DLL-ку для теста которая экспортирует класс так:

файлик export.h

class CBaseVideoWin {
  public:
   virtual initOverlay(void)=0;
   virtual viewWindow((void*) wnd)=0;
   }

extern "C"__declspec(dllexport) CBaseVideoWin* createCVideoWin(void);


файлик videowin.h

#include "export.h"

class CVideoWin: public CBaseVideoWin
{
public:
    CVideoWin(void);
    ~CVideoWin(void);
    virtual int viewWindow(void* wnd);
    virtual int initOverlay(void);
private:
    HANDLE h0;
    HANDLE h1;
};


файлик videowin.cpp

#include "StdAfx.h"
#include ".\videowin.h"
#include "tmsdk.h"

CVideoWin::CVideoWin(void)
{
}

CVideoWin::~CVideoWin(void)
{
}

int CVideoWin::viewWindow(void* wnd)
{
             HWND* hWnd = (HWND*) wnd              
        HDC hdc = GetDC(hWnd);     
                 //....
                 // Здесь я устанавливаю фон RGB(10,10,10);
                 // Вывожу видео....
                 //....
                ReleaseDC(hdc);
        return 0;
}

int CVideoWin::initOverlay(void)
{

    InitDSPs();
    h0 = ChannelOpen(0);
    h1 = ChannelOpen(1);
    return 0;
}


файлик video.cpp создание DLL video.dll

#include "stdafx.h"
#include <afxdllx.h>
#include "videowin.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

static AFX_EXTENSION_MODULE videoDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
   // код сгенерированный VS
    return 1;   // ok
}

CBaseVideoWin* createCVideoWin()
 {
     return new CVideoWin();
 }


Далее я подключаю созданную DLL в билдере и получаю указатель на объект CVideoWin:

CBaseVideoWin* cVideo = createCVideoWin();


а затем вызываю

 cVideo->initOverlay();
  cVideo->viewWindow((*void) Form1->Handle);


ошибок при выполнении никаких, но ничего не происходит, а должен установиться
RGB(10,10,10) цвет формы в заданном прямоугольнике (RECT).

Вопрос в чем может быть проблема?
И если можно рекомендации как лучше построить программную архитектуру в данном случае?
Помогите плиззз
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.