Привет Всем!
У меня следующая проблема
Нужно разработать программную архитектуру телевизионной системы видеонаблюдения (далее ТСН).
Есть некий 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).
Вопрос в чем может быть проблема?
И если можно рекомендации как лучше построить программную архитектуру в данном случае?
Помогите плиззз