我有Black Magic Design公司的采集卡。在相关文档中,描述了来自GetBytes
接口的IDeckLinkVideoInputFrame
方法允许直接访问视频帧的数据缓冲区。这是我的工作:
HRESULT DeckLinkDevice::VideoInputFrameArrived (/* in */ IDeckLinkVideoInputFrame* videoFrame, /* in */ IDeckLinkAudioInputPacket* audioPacket)
{
char* str1;
voidPtrToFrame = NULL;
videoFrame->GetBytes(&voidPtrToFrame);
sprintf(str1, "%p", voidPtrToFrame);
// the below line does not work.
SetDlgItemText(m_uiDelegate->GetSafeHwnd(), IDC_handytxtBox, str1);
}
我还在voidPtrToFrame
的课程中定义了DeckLinkDevice
:
class DeckLinkDevice::IDeckLinkInputCallback
{
...
void* voidPtrToFrame;
...
}
在最后一行中出现与str1
:
类型“char *”的参数与类型的参数不兼容 LPCWSTR
我想知道:
如何在Edit控件中显示voidPtrToFrame
的值?即我想呈现包含视频帧的缓冲区的地址。在下图中,我提供了有关GetBytes
方法的必要信息。
我搜索了很多东西并测试了几种方法。但我无法在MFC中实现它们。
答案 0 :(得分:2)
你有两个问题:
<强> 1。您会遇到崩溃或至少未定义的行为
变量str1
永远不会被初始化。这是一个经典的初学者错误。
问题在于:
char* str1;
voidPtrToFrame = NULL;
videoFrame->GetBytes(&voidPtrToFrame);
// here str1 points to an interterminate location, it has never been
// initialized !! Therefore your program most likely will crash
sprintf(str1, "%p", voidPtrToFrame)
你需要这个:
char str1[20]; //<<< changement here
voidPtrToFrame = NULL;
videoFrame->GetBytes(&voidPtrToFrame);
// now str1 points to a 20 byte buffer
sprintf(str1, "%p", voidPtrToFrame);
<强> 2。您必须使用宽字符
您正在为unicode进行编译,因此您需要这个(此前包含其他更正):
wchar_t str1[20];
voidPtrToFrame = NULL;
videoFrame->GetBytes(&voidPtrToFrame);
wsprintf(str1, L"%p", voidPtrToFrame);
SetDlgItemText(m_uiDelegate->GetSafeHwnd(), IDC_handytxtBox, str1);