Использование Windows Forms и VC ++ с неуправляемыми статическими библиотеками - PullRequest
2 голосов
/ 05 мая 2011

В настоящее время я пытаюсь написать пользовательский интерфейс для системы сбора данных в Visual Studio C ++ 2010, и у меня возникли большие проблемы, связанные с взаимодействием сторонних библиотек, которые я использую, и Windows Forms.Две библиотеки, которые я использую: DAQX, библиотека C для системы сбора данных и VITCam, библиотека C ++ для высокоскоростной камеры 1394.Очень неприятно пытаться работать с этими библиотеками и любой библиотекой пользовательского интерфейса, которую может предложить VS, поскольку ни один из аргументов функции никогда не ладит.

DAQX использует типы окон, такие как WORD и DWORD, в обычном стиле C, икогда я пишу обычную программу, никакой пользовательский интерфейс не работает, она работает нормально, но Windows Forms, кажется, ненавидит всякий раз, когда я хочу создать простой массив DWORD внутри класса.

VITCam еще хуже.Я могу нормально открыть камеру, но полностью теряюсь, когда пытаюсь каким-то образом вывести изображение на экран.Я не раскрыл эквиваланет, простой способ вывести его на экран относительно того, как это изложено в документации:

CDC* pDC=GetDC(); // obtain the device context for your window...
// move the image data
::SetDIBitsToDevice(pDC->m_hDC,0,0,
(int) (MyCam.GetDispBuf()->bmiHeader.biWidth),
(int) (MyCam.GetDispBuf()->bmiHeader.biHeight),
0,0,0,(WORD) (WORD) MyCam.GetDispBuf()->bmiHeader.biHeight,
MyCam.GetDispPixels(),MyCam.GetDispBuf(),
DIB_RGB_COLORS);

Я едва могу следовать этому как есть.Итак, без особых проблем, как большинство людей работают со статическими неуправляемыми библиотеками, которые не были разработаны с учетом форм Windows Forms?Я пробовал MFC, как упоминалось в документации VITCam, но это имеет мало смысла и не настолько интуитивно, как кажется Windows Forms.

Редактировать: это сообщение об ошибке, которое я получаю при попытке использовать обычный(по крайней мере для меня) массив.

Ошибка 1 ошибка C4368: невозможно определить «буфер» как член управляемого «WirelessHeadImpact :: Form1»: смешанные типы не поддерживаются

И это указываетк этой строке:

private:
WORD buffer[BUFFSIZE*CHANCOUNT];

То, что у меня было раньше, было таким:

static array<WORD>^ _buffer;

И внутри функции я создаю первый массив, передаю его функции, а затем возвращаю последний послецикл и обновление массива.

            WORD buffer[BUFFSIZE*CHANCOUNT];
            DWORD scansCollected = 0;
            while (total_scans < SCANS) {

                daqAdcTransferBufData(_handle, buffer, BUFFSIZE, DabtmWait, &scansCollected);

                if (scansCollected > 0) {
                    for (WORD i=0;i<scansCollected;i++) {
                        _buffer[i] = buffer[i];
                    }

1 Ответ

2 голосов
/ 09 мая 2011

смешанный тип поддержка удалена в Visual C ++ 2005. Если вы хотите связать массив DWORD с управляемым классом, используйте new (не gcnew), чтобы разместить сам массив в собственной куче и сохранить указатель массива в классе.

кстати, вы не можете передавать адреса объектов в управляемой куче собственной функции без закрепления объекта, в противном случае GC может свободно перемещать объект в любое время. Если вы хотите передать управляемое значение в собственную функцию, убедитесь, что вы передали значение по значению или объект закреплен.

Это помогает читателям, если вы публикуете фактическое сообщение об ошибке, которое вы получаете, вместо того, чтобы угадывать из вашего вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...