使用Windows窗体和vc++与非托管静态库



我目前正试图在Visual Studio c++ 2010中为数据采集系统编写一个UI,并且我在处理我使用的第三方库和Windows窗体的接口时遇到了很多麻烦。我使用的两个库是DAQX,一个用于数据采集系统的C库,和VITCam,一个用于1394高速摄像机的c++库。尝试使用这些库和VS提供的任何UI库是非常令人沮丧的,因为没有一个函数参数能够相处。

DAQX使用windows类型,如WORD和DWORD,在正常的C时尚,当我写一个正常的程序,不涉及UI,它工作得很好,但windows窗体似乎讨厌任何时候我想在类中做一个简单的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窗体开发的?我尝试过MFC,正如VITCam文档提到的,但它没有什么意义,也不像Windows窗体那样直观。

编辑:这是我在尝试使用正常(至少对我来说)数组时得到的错误消息。

错误1:无法将'buffer'定义为托管'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];
                    }

混合类型支持在Visual c++ 2005中被删除。如果您希望将DWORD数组关联到托管类,请使用new(而不是gcnew)在本机堆上分配数组本身,并将数组的指针保存在类中。

顺便说一下,

不能在不固定对象的情况下将托管堆上对象的地址传递给本机函数,否则GC可以随时自由移动对象。如果你想传递一个托管值给本机函数,请确保你的传递值或对象是固定的。

如果你把你得到的实际错误信息贴出来,而不是从你的问题中猜测出来,这对读者是有帮助的。

最新更新