снова mirror driver
От: Neco  
Дата: 26.08.07 14:22
Оценка:
Не понимаю как работать с mirror driver'ом.
Сбился в поисках последовательности действий, чтобы понять, что к чему. Исходники VNC очень большие — не разобраться вовек.
Есть ddk 2003 — ставлю.
Пример в папке mirror "просто так" ничего не показывает. Раскомментировал строку "CreateMyWindow...", и поставил MessageBox после создания окна — в окне всё синее.
Что характерно при поисках, обнаруживал как топики со словами "откомпилил ММ пример, всё работает, но...." и далее по тексту, что там его не устраивает; так и топики со словами "данный пример — просто пустышка, нужно многое дописывать ручками".
Итак, вопросы:
1. Пример драйвера в ddk полноценный? На его базе возможно написать аналог радмина?
2. Пример программы, использующей этот драйвер, в ddk законченный? т.е. должен ли он показывать кусок экрана или нет? Просто чтобы знать, что у меня что-то не так как у всех с системой.
3. Каков порядок действий, при подписывании своей программы на изменения экрана? Вначале я так понял идёт это:
========================
1. в реестре проставляем 1 в значении Attach.ToDesktop.
2. выполняем ChangeDisplaySettingsEx — видимо драйвер перечитывает реестр и цепляется к экрану, если там 1.
3. дальше идёт кусок кода:
        HDC hdc = CreateDC("DISPLAY",
                           deviceName,
                           NULL,
                           NULL);

        printf("hdc1=%d\n",hdc);
        // we should be hooked as layered at this point
        HDC hdc2 = CreateCompatibleDC(hdc);
        printf("hdc2=%d\n",hdc2);
        // call DrvCreateDeviceBitmap
        HBITMAP hbm = CreateCompatibleBitmap(hdc, 100, 100);

        SelectObject(hdc2, hbm);
        
        BitBlt(hdc2, 0, 0, 50, 50, hdc, 0, 0, SRCCOPY);

        // delete the device context
        DeleteDC(hdc2);
        DeleteDC(hdc);

который я видел в примерах и без драйвера (только там было GetDC(0) — с рабочего стола, видимо) — это снимок с нашего mirror-устройства, я так понял. Но вот чего я не понял, так почему, когда я заменяю deviceName на любую другую надпись, всё работает как и работало — разве не должен был CreateDC вернуть 0?
========================

дальше начинается неразбериха — если оповещение драйвером об изменениях происходит через оконные сообщения, то как окно из CreateMyWindow подписывается на эти сообщения? или оповещения рассылаются всем окнам?

В общем, методом тыка ничего не получается выяснить — объясните, пожалуйста, кто-нибудь — как всё это должно работать?
всю ночь не ем, весь день не сплю — устаю
Re: снова mirror driver
От: Andrew S Россия http://alchemy-lab.com
Дата: 27.08.07 18:21
Оценка:
N>Итак, вопросы:
N>1. Пример драйвера в ddk полноценный? На его базе возможно написать аналог радмина?

Нет. Да — только в качестве базы.

N>2. Пример программы, использующей этот драйвер, в ddk законченный? т.е. должен ли он показывать кусок экрана или нет? Просто чтобы знать, что у меня что-то не так как у всех с системой.


Нет.

N>3. Каков порядок действий, при подписывании своей программы на изменения экрана? Вначале я так понял идёт это:

N>========================
N>1. в реестре проставляем 1 в значении Attach.ToDesktop.
N>2. выполняем ChangeDisplaySettingsEx — видимо драйвер перечитывает реестр и цепляется к экрану, если там 1.
N>3. дальше идёт кусок кода:
N>который я видел в примерах и без драйвера (только там было GetDC(0) — с рабочего стола, видимо) — это снимок с нашего mirror-устройства, я так понял. Но вот чего я не понял, так почему, когда я заменяю deviceName на любую другую надпись, всё работает как и работало — разве не должен был CreateDC вернуть 0?
N>========================


Должен. И возвращает.

N>дальше начинается неразбериха — если оповещение драйвером об изменениях происходит через оконные сообщения, то как окно из CreateMyWindow подписывается на эти сообщения? или оповещения рассылаются всем окнам?


Там просто заготовка — никакого обмена нет. Смотрите ExtEscape, впрочем, можно и другие механизмы использовать — как в обычных драйверах. Но будут проблемы с синхронизацией, которая в ExtEscape выполняется автоматически.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[2]: снова mirror driver
От: Neco  
Дата: 30.08.07 13:08
Оценка:
спасибо за ответ

передумал пока писать свой драйвер — решил воспользоваться бесплатным миражом (dfmirage).
копаюсь в исходниках vnc.
если будут результаты, выложу здесь.
всю ночь не ем, весь день не сплю — устаю
Re[3]: снова mirror driver
От: Neco  
Дата: 30.08.07 20:15
Оценка:
Пока начиркал вот это:

            GETCHANGESBUF buf = new GETCHANGESBUF();
            buf.userbuffer = 0;
            CHANGES_BUF tmp_chbuf = new CHANGES_BUF();
            tmp_chbuf.counter = 0;
            tmp_chbuf.pointrect = new CHANGES_RECORD[MAXCHANGES_BUF];
            for (int i = 0; i < MAXCHANGES_BUF; i++) {
                tmp_chbuf.pointrect[i] = new CHANGES_RECORD();
            }

            int tmpbuf_sz = Marshal.SizeOf(tmp_chbuf);

            IntPtr buf_ptr = Marshal.AllocHGlobal(tmpbuf_sz);
            Marshal.StructureToPtr(tmp_chbuf, buf_ptr, false);
            buf.buffer = buf_ptr.ToInt32();

            //CHANGES_BUF test = new CHANGES_BUF();
            //int sz = Marshal.SizeOf(test);
            //test.pointrect = new CHANGES_RECORD[1];
            //test.pointrect[0] = new CHANGES_RECORD();
            //int sz2 = Marshal.SizeOf(test.pointrect[0]);
            int dnum = 0;
            DISPLAY_DEVICE disp = new DISPLAY_DEVICE();
            disp.cb = Marshal.SizeOf(disp);
            //string devName = @"\\.\DISPLAYV1";
            //string devDescr = "Microsoft Mirror Driver";
            string devDescr = "Mirage Driver";
            int ret;
            while ((ret = EnumDisplayDevices(0, dnum, ref disp, 0)) > 0) {
                if (devDescr == disp.DeviceString)
                    break;
                dnum++;
            }

            int hdeskCurrent, hdeskInput;

            hdeskInput = 0;

            hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
            if (hdeskCurrent != 0) {
                bool out_bool = false;
                hdeskInput = OpenInputDesktop(0, ref out_bool, MAXIMUM_ALLOWED);
                if (hdeskInput != 0)
                    SetThreadDesktop(hdeskInput);
            }

            DEVMODE devmode = new DEVMODE();
            devmode.dmSize = 156;// (short)Marshal.SizeOf(devmode);
            devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
            devmode.dmDeviceName = "";
            devmode.dmBitsPerPel = 32;

            devmode.dmFields |= DM_POSITION;

            devmode.dmPelsWidth = 100;
            devmode.dmPelsHeight = 100;

            //devmode.dmDeviceName = "mirror";

            int mcode = ChangeDisplaySettingsEx(disp.DeviceName, ref devmode, 0, CDS_UPDATEREGISTRY, 0);
            //mcode = ChangeDisplaySettingsEx(disp.DeviceName, ref devmode, 0, 0, 0);
            int w32err = System.Runtime.InteropServices.Marshal.GetLastWin32Error();

            SetThreadDesktop(hdeskCurrent);
            CloseDesktop(hdeskInput);


            //string mout = "";
            int mdc = CreateDC2(disp.DeviceName, 0, 0, 0);

            //int eret;
            //eret = ExtEscape2(mdc, TESTMAPPED, 0, null, 0, null);
            int sz_buf = Marshal.SizeOf(buf);
            IntPtr ptr = Marshal.AllocHGlobal(sz_buf);
            Marshal.StructureToPtr(buf, ptr, false);

            int drvCr = ExtEscape(
                mdc,
                MAP1,
                0, 0,
                sz_buf, ptr.ToInt32());

            //Marshal.PtrToStructure(ptr, buf);

            object obj = Marshal.PtrToStructure(ptr, typeof(GETCHANGESBUF));
            buf = (GETCHANGESBUF)obj;

            //exte

            BITMAPINFO binfo = new BITMAPINFO();
            int hDib;
            int dibAddr = 0;

            binfo.bmiHeader.biSize = 40;
            binfo.bmiHeader.biWidth = 100;
            binfo.bmiHeader.biHeight = 100;
            binfo.bmiHeader.biPlanes = 1;
            binfo.bmiHeader.biBitCount = 32;
            binfo.bmiHeader.biCompression = 0;
            binfo.bmiHeader.biSizeImage = (int)((binfo.bmiHeader.biWidth + 3) & 0xFFFFFFFC) * binfo.bmiHeader.biHeight;

            int scrDc = GetDC(0);
            int memDc = CreateCompatibleDC(scrDc);
            hDib = CreateDIBSection(memDc, ref binfo, DIB_RGB_COLORS, ref dibAddr, 0, 0);

            int oldDib = SelectObject(memDc, hDib);

            int ptr_src = buf.userbuffer;
            int ptr_dst = dibAddr;
            int len = binfo.bmiHeader.biSizeImage;
            CopyMemory(ptr_dst, ptr_src, len);
            int picdc = GetDC(pichwnd);

            BitBlt(picdc, 0, 0, binfo.bmiHeader.biWidth, binfo.bmiHeader.biHeight, memDc, 0, 0, SRCCOPY);

            ReleaseDC(pichwnd, picdc);
            ReleaseDC(0, scrDc);
            SelectObject(memDc, oldDib);
            DeleteObject(hDib);
            DeleteDC(memDc);


            drvCr = ExtEscape(
                mdc,
                UNMAP1,
                sz_buf, ptr.ToInt32(),
                0, 0);

            DeleteDC(mdc);


картинка почему-то перевёрнута по горизонтали...
всю ночь не ем, весь день не сплю — устаю
Re[4]: снова mirror driver
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.08.07 22:03
Оценка: 2 (1)
N>картинка почему-то перевёрнута по горизонтали...

По горизонтали или по вертикали? Если второе — то используйте отрицательную высоту при создании диб секции.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[5]: снова mirror driver
От: Neco  
Дата: 30.08.07 22:34
Оценка:
AS> используйте отрицательную высоту при создании диб секции.
Большое спасибо!
Помогло!

вот то, что готово на данный момент (пока без учёта изменений на экране):
using System;
using System.Collections.Generic;
using System.Text;
using System.Runtime.InteropServices;

namespace proRadmin {
    class clsScreenShot {

        [DllImport("kernel32.dll", EntryPoint = "RtlMoveMemory")]
        private static extern void CopyMemory(int Destination, int Source, int Length);

        [DllImport("gdi32.dll")]
        private static extern int CreateDIBSection(int hDC, ref BITMAPINFO pBitmapInfo, int un, ref int lplpVoid, int handle, int dw);

        [DllImport("gdi32.dll")]
        private static extern int SelectObject(int hdc, int hObject);
        [DllImport("gdi32.dll")]
        private static extern int DeleteObject(int hObject);

        [DllImport("gdi32.dll", EntryPoint = "ExtEscape")]
        private static extern int ExtEscape(int hdc, int nEscape, int cbInput, int lpszInData, int cbOutput, int lpszOutData);

        [DllImport("user32.dll")]
        private static extern int GetDC(int hwnd);
        [DllImport("user32.dll")]
        private static extern int ReleaseDC(int hwnd, int hdc);
        [DllImport("gdi32.dll")]
        private static extern int BitBlt(int hDestDC, int x, int y, int nWidth, int nHeight, int hSrcDC, int xSrc, int ySrc, int dwRop);

        [DllImport("gdi32.dll", EntryPoint = "CreateDCA")]
        private static extern int CreateDC(string lpDriverName, int lpDeviceName, int lpOutput, int lpInitData);
        [DllImport("gdi32.dll")]
        private static extern int CreateCompatibleDC(int hdc);
        [DllImport("gdi32.dll")]
        private static extern int DeleteDC(int hdc);

        [DllImport("user32.dll", EntryPoint = "ChangeDisplaySettingsExA")]
        private static extern int ChangeDisplaySettingsEx(string lpszDeviceName, ref DEVMODE lpDevMode, int hwnd, int dwflags, int lParam);
        [DllImport("user32.dll", EntryPoint = "EnumDisplayDevicesA")]
        private static extern int EnumDisplayDevices(int lpDevice, int iDevNum, ref DISPLAY_DEVICE lpDisplayDevice, int dwFlags);
        [DllImport("user32.dll")]
        private static extern int GetThreadDesktop(int dwThread);
        [DllImport("user32.dll")]
        private static extern int OpenInputDesktop(int dwFlags, ref Boolean fInherit, int dwDesiredAccess);
        [DllImport("user32.dll")]
        private static extern int CloseDesktop(int hDesktop);
        [DllImport("user32.dll")]
        private static extern int SetThreadDesktop(int hDesktop);
        [DllImport("kernel32.dll")]
        private static extern int GetCurrentThreadId();

        private const int scan_X = 0;
        private const int scan_Y = 0;
        private const int scan_W = 1280;
        private const int scan_H = 1024;
        private const string used_driver = "Mirage Driver";

        private const int SRCCOPY = 0xCC0020;

        private const int DIB_RGB_COLORS = 0;

        private const int MAXIMUM_ALLOWED = 0x2000000;

        private const int CDS_UPDATEREGISTRY = 0x1;
        private const int DM_BITSPERPEL = 0x40000;
        private const int DM_PELSHEIGHT = 0x100000;
        private const int DM_PELSWIDTH = 0x80000;
        private const int DM_POSITION = 0x20;

        private const int TESTMAPPED = 1051;
        private const int MAP1 = 1030;
        private const int UNMAP1 = 1031;
        //private const int MAXCHANGES_BUF = 200;
        private const int MAXCHANGES_BUF = 20000;
          
        [StructLayout(LayoutKind.Sequential)]
        private struct RECT {
            internal int Left;
            internal int Top;
            internal int Right;
            internal int Bottom;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct POINT {
            internal int x;
            internal int y;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct CHANGES_RECORD {
            internal ulong type;
            internal RECT rect;
            internal RECT origrect;
            internal POINT point;
            internal ulong color;
            internal ulong refcolor;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct CHANGES_BUF {
            internal ulong counter;
            [MarshalAs(UnmanagedType.ByValArray, SizeConst = MAXCHANGES_BUF)]
            internal CHANGES_RECORD[] pointrect;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct GETCHANGESBUF {
            //internal CHANGES_BUF *buffer;
            internal int buffer;
            internal int userbuffer;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct DEVMODE {
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            internal string dmDeviceName;
            internal Int16 dmSpecVersion;
            internal Int16 dmDriverVersion;
            internal Int16 dmSize;
            internal Int16 dmDriverExtra;
            internal int dmFields;
            internal Int16 dmOrientation;
            internal Int16 dmPaperSize;
            internal Int16 dmPaperLength;
            internal Int16 dmPaperWidth;
            internal Int16 dmScale;
            internal Int16 dmCopies;
            internal Int16 dmDefaultSource;
            internal Int16 dmPrintQuality;
            internal Int16 dmColor;
            internal Int16 dmDuplex;
            internal Int16 dmYResolution;
            internal Int16 dmTTOption;
            internal Int16 dmCollate;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            internal string dmFormName;
            internal Int16 dmUnusedPadding;
            internal Int16 dmBitsPerPel;
            internal int dmPelsWidth;
            internal int dmPelsHeight;
            internal int dmDisplayFlags;
            internal int dmDisplayFrequency;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct BITMAPINFOHEADER {
            internal int biSize;
            internal int biWidth;
            internal int biHeight;
            internal Int16 biPlanes;
            internal Int16 biBitCount;
            internal int biCompression;
            internal int biSizeImage;
            internal int biXPelsPerMeter;
            internal int biYPelsPerMeter;
            internal int biClrUsed;
            internal int biClrImportant;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct RGBQUAD {
            internal byte rgbBlue;
            internal byte rgbGreen;
            internal byte rgbRed;
            internal byte rgbReserved;
        }
        [StructLayout(LayoutKind.Sequential)]
        private struct DISPLAY_DEVICE {
            internal Int32 cb;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 32)]
            internal string DeviceName;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            internal string DeviceString;
            Int32 StateFlags;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            internal string DeviceID;
            [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
            internal string DeviceKey;
        }

        [StructLayout(LayoutKind.Sequential)]
        private struct BITMAPINFO {
            internal BITMAPINFOHEADER bmiHeader;
            internal RGBQUAD bmiColors;
        }

        // переменные
        // =================
        // буфер
        GETCHANGESBUF m_buf;
        IntPtr m_ch_buf_ptr;
        // драйвер
        DISPLAY_DEVICE m_disp;
        // device context
        int m_drv_dc;
        // DIB section
        int m_dib, m_old_dib, m_dib_dc;
        int m_dib_addr;
        IntPtr m_buf_ptr;
        BITMAPINFO m_binfo;

        public void Init() {
            iBuf();
            iDriver();
            iDc();
            iDIB();
        }
        public void DeInit() {
            dDIB();
            dBuf();
            dDriver();
            dDc();
        }
        public void CopyScr(int pichwnd) {
            //int scrDc = GetDC(0);
            int picDc = GetDC(pichwnd);
            BitBlt(picDc, 0, 0, scan_W, scan_H, m_drv_dc, 0, 0, SRCCOPY);
            ReleaseDC(pichwnd, picDc);
            //ReleaseDC(0, scrDc);
        }
        public void CopyMem(int pichwnd) {
            int picDc = GetDC(pichwnd);
            CopyMemory(m_dib_addr, m_buf.userbuffer, m_binfo.bmiHeader.biSizeImage);
            BitBlt(picDc, 0, 0, scan_W, scan_H, m_dib_dc, 0, 0, SRCCOPY);
            ReleaseDC(pichwnd, picDc);
        }
        private void iBuf() {
            m_buf = new GETCHANGESBUF();
            m_buf.userbuffer = 0;
            CHANGES_BUF tmp_chbuf = new CHANGES_BUF();
            tmp_chbuf.counter = 0;
            tmp_chbuf.pointrect = new CHANGES_RECORD[MAXCHANGES_BUF];
            for (int i = 0; i < MAXCHANGES_BUF; i++) {
                tmp_chbuf.pointrect[i] = new CHANGES_RECORD();
            }

            int tmpbuf_sz = Marshal.SizeOf(tmp_chbuf);

            m_ch_buf_ptr = Marshal.AllocHGlobal(tmpbuf_sz);
            Marshal.StructureToPtr(tmp_chbuf, m_ch_buf_ptr, false);
            m_buf.buffer = m_ch_buf_ptr.ToInt32();
        }
        private void dBuf() {
            Marshal.FreeHGlobal(m_ch_buf_ptr);
        }
        private void iDriver() {
            int dnum = 0;
            m_disp = new DISPLAY_DEVICE();
            m_disp.cb = Marshal.SizeOf(m_disp);
            int ret;
            while ((ret = EnumDisplayDevices(0, dnum, ref m_disp, 0)) > 0) {
                if (used_driver == m_disp.DeviceString)
                    break;
                dnum++;
            }

            int hdeskCurrent, hdeskInput;

            hdeskInput = 0;

            hdeskCurrent = GetThreadDesktop(GetCurrentThreadId());
            if (hdeskCurrent != 0) {
                bool out_bool = false;
                hdeskInput = OpenInputDesktop(0, ref out_bool, MAXIMUM_ALLOWED);
                if (hdeskInput != 0)
                    SetThreadDesktop(hdeskInput);
            }

            DEVMODE devmode = new DEVMODE();
            devmode.dmSize = 156;
            devmode.dmFields = DM_BITSPERPEL | DM_PELSWIDTH | DM_PELSHEIGHT;
            devmode.dmDeviceName = "";
            devmode.dmBitsPerPel = 32;

            devmode.dmFields |= DM_POSITION;

            devmode.dmPelsWidth = scan_W;
            devmode.dmPelsHeight = scan_H;

            int mcode = ChangeDisplaySettingsEx(m_disp.DeviceName, ref devmode, 0, CDS_UPDATEREGISTRY, 0);

            SetThreadDesktop(hdeskCurrent);
            CloseDesktop(hdeskInput);
        }
        private void dDriver() {

        }
        private void iDc() {
            m_drv_dc = CreateDC(m_disp.DeviceName, 0, 0, 0);
        }
        private void dDc() {
            DeleteDC(m_drv_dc);
        }
        private void iDIB() {
            int sz_buf = Marshal.SizeOf(m_buf);
            m_buf_ptr = Marshal.AllocHGlobal(sz_buf);
            Marshal.StructureToPtr(m_buf, m_buf_ptr, false);

            int drvCr = ExtEscape(
                m_drv_dc,
                MAP1,
                0, 0,
                sz_buf, m_buf_ptr.ToInt32());

            //Marshal.PtrToStructure(ptr, buf);

            object obj = Marshal.PtrToStructure(m_buf_ptr, typeof(GETCHANGESBUF));
            m_buf = (GETCHANGESBUF)obj;

            //exte

            m_binfo = new BITMAPINFO();
            //int hDib;
            //int dibAddr = 0;

            m_binfo.bmiHeader.biSize = 40;
            m_binfo.bmiHeader.biWidth = scan_W;
            m_binfo.bmiHeader.biHeight = - scan_H;
            m_binfo.bmiHeader.biPlanes = 1;
            m_binfo.bmiHeader.biBitCount = 32;
            m_binfo.bmiHeader.biCompression = 0;
            m_binfo.bmiHeader.biSizeImage = (int)(scan_W * scan_H * (m_binfo.bmiHeader.biBitCount / 8));
            //binfo.bmiHeader.biSizeImage = (int)((binfo.bmiHeader.biWidth + 3) & 0xFFFFFFFC) * binfo.bmiHeader.biHeight;

            //int scrDc = GetDC(0);
            m_dib_dc = CreateCompatibleDC(m_drv_dc);
            m_dib = CreateDIBSection(m_dib_dc, ref m_binfo, DIB_RGB_COLORS, ref m_dib_addr, 0, 0);

            m_old_dib = SelectObject(m_dib_dc, m_dib);
        }
        private void dDIB() {
            int sz_buf = Marshal.SizeOf(m_buf);
            int drvCr = ExtEscape(
                        m_drv_dc,
                        UNMAP1,
                        sz_buf, m_buf_ptr.ToInt32(),
                        0, 0);
            SelectObject(m_dib_dc, m_old_dib);
            DeleteObject(m_dib);
            DeleteDC(m_dib_dc);
            Marshal.FreeHGlobal(m_buf_ptr);
        }
    }
}


P.S. ах, млин
ещё ж реестр-то у меня ручками выставлен — тоже пока тут нет...
всю ночь не ем, весь день не сплю — устаю
Re[6]: снова mirror driver
От: Andrew S Россия http://alchemy-lab.com
Дата: 30.08.07 23:16
Оценка: 1 (1)
AS>> используйте отрицательную высоту при создании диб секции.
N>Большое спасибо!
N>Помогло!

Я бы порекомендовал вам сделать все основное в unmanaged, потому как то, что сейчас делаете вы, будет безбожно тормозить. Вытащить нужные интерфейсы наружу в виде функций или COM объекта и спокойно пользовать. Это будет куда как практичнее, особенно с учетом последующей обработки полученных изменений. Вообще, откровенно, не понимаю, зачем такие вещи могу пригодится непосредственно в managed коде. Там, где требуется хоть какая-то минимальная производительность при взаимодействии с системой, managed пока что делать нечего.
http://www.rusyaz.ru/pr — стараемся писАть по-русски
Re[6]: снова mirror driver
От: Аноним  
Дата: 15.09.07 09:03
Оценка:
Здравствуйте, Neco, Вы писали:


N>P.S. ах, млин

N>ещё ж реестр-то у меня ручками выставлен — тоже пока тут нет...

а можно попросить на мыло (dabeat@bk.ru) экзампл который юзает этот класс, а то второй день мучаюсь а результата 0 (((
Re[7]: снова mirror driver
От: sev http://www.demoforge.com
Дата: 15.09.07 09:33
Оценка:
А>а можно попросить на мыло (dabeat@bk.ru) экзампл который юзает этот класс, а то второй день мучаюсь а результата 0 (((

За нормальным и работающим примером идём на сайт TightVNC и качаем исходники. Всё, что относится к mirror-драйверу, лежит в файлах VideoDriver.h и VideoDriver.cpp.
Re[7]: снова mirror driver
От: Neco  
Дата: 12.11.07 17:20
Оценка:
А>а можно попросить на мыло (dabeat@bk.ru) экзампл который юзает этот класс, а то второй день мучаюсь а результата 0 (((

выслал
всю ночь не ем, весь день не сплю — устаю
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.