我目前正在尝试在Visual Studio C ++ 2010中为数据采集系统编写UI,我在处理我正在使用的第三方库和Windows Forms的接口方面遇到了很多麻烦。我使用的两个库是DAQX,一个用于数据采集系统的C库,以及VITCam,一个用于1394高速摄像机的C ++库。尝试使用VS提供的这些库和任何UI库是非常令人沮丧的,因为没有任何函数参数可以使用。
DAQX以正常的C方式使用WORD和DWORD之类的Windows类型,当我正在编写普通程序时,没有涉及到UI,它工作正常,但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:无法将'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];
}
答案 0 :(得分:2)
mixed type支持。如果要将DWORD数组关联到托管类,请使用new(而不是gcnew)在本机堆上分配数组本身并保存指针在类中的数组。
顺便说一句,你不能在没有固定对象的情况下将托管堆上的对象地址传递给本机函数,否则GC可以随时移动对象。如果要将托管值传递给本机函数,请确保按值或对象固定传递。如果您发布实际的错误消息,它可以帮助读者,而不必从您的问题中猜出。