我试图将一些C ++代码重构为dotnet(c#或vb)。 C ++代码使用Variant类型,并在将pbVal调用到COM对象后使用它。这是C ++代码的重要部分:
long bufSize;
int width, height;
VARIANT var;
TCHAR tc[32];
::GetWindowText(GetDlgItem(IDC_EDIT_RESOL_X)->m_hWnd, tc, 12);
width = _ttoi(tc);
::GetWindowText(GetDlgItem(IDC_EDIT_RESOL_Y)->m_hWnd, tc, 12);
height = _ttoi(tc);
m_dlgVideo.m_tvsLive.GetSnapshot(m_dlgVideo.m_lCurChID, lCompression, width, height, &var, &bufSize);
CFile oWrFile;
oWrFile.Open(_T("C:\\temp\\test_asbuffer.jpg"), CFile::modeCreate |
CFile::modeReadWrite);
oWrFile.Write(var.pbVal, bufSize);
oWrFile.Close();
CoTaskMemFree(var.pbVal);
我的困惑(缺乏知识)与将C ++ Variant传递给GetSnapshot调用有关。我的假设是在调用之后,Variant(var)将作为数组返回,但它只返回单个字节值(255)。 在Dotnet中,我尝试将var作为Object,Byte或VariantType传递,并且每次都得到相同的结果(单字节值为255)。如果我尝试传入一个数组(例如Object []或Byte []或Variant []),该方法会抱怨并说 无法转换类型' System.Byte'输入' System.Byte []'
我的dotnet代码看起来像这样
System.Byte imgVar = 0;
long imgSize = 0L;
try {
axTVS.Snapshot(iTVSID, 50, false);
axTVS.GetSnapshot(iTVSID, 50L, 400, 225, imgVar, imgSize);
} catch (Exception ex) {
//catch error and handle here
}
imgSize返回一个看似有效的数组大小(13,559),但那个讨厌的imgVar只是一个字节(255)。正如我所说 - 尝试传入一个字节数组失败。
有谁知道如何处理这个问题?
我的假设(可能存在缺陷)是var应该作为图像数据的字节数组返回 - 然后我可以轻松地将其转换为图像。