将C ++ Variant pbVal转换为dotnet

时间:2017-07-21 19:35:05

标签: c# c++ variant

我试图将一些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应该作为图像数据的字节数组返回 - 然后我可以轻松地将其转换为图像。

0 个答案:

没有答案