【问题标题】:How to display the value of a pointer In MFC?如何在 MFC 中显示指针的值?
【发布时间】:2016-05-04 12:37:41
【问题描述】:

我有一张来自 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);
}

我还在DeckLinkDevice 的类中定义了voidPtrToFrame

class DeckLinkDevice::IDeckLinkInputCallback
{
...
void* voidPtrToFrame;
...
}

最后一行出现与str1相关的错误:

“char*”类型的参数与类型的参数不兼容 LPCWSTR

我想知道:

如何在编辑控件中显示voidPtrToFrame 的值?即我想提供包含视频帧的缓冲区地址。在下图中,我提供了有关GetBytes 方法的必要信息。

我搜索了很多,并测试了几种方法。但我无法在 MFC 中实现它们。

【问题讨论】:

  • 这与 Windows API、MFC 甚至 C++ 无关。它实际上只是关于 C、指针、未初始化的数据和未定义的行为。您应该首先阅读 C 的介绍,以了解它与托管执行环境(如 .NET)有何不同。
  • @IInspectable 问题的SetDlgItemText 部分 有点与Windows 相关。
  • 请不要以使已发布答案无效的方式更改问题。此外,您甚至没有在此处使用任何特定于 MFC 的东西(查询窗口句柄除外)。在这种特殊情况下,使用 Windows API 的应用程序和使用 MFC 的应用程序几乎相同。您可能需要更多地研究 Windows API 以了解 MFC 如何适应这一点。然而,这个问题根本与 MFC 无关。
  • Convert char[] to LPCWSTR的可能重复
  • “我不知道 win32 应用程序中有 SetDlgItemText。” - SetDlgItemText 是从 user32.dll 导出的。这是 Win32 子系统(不是 MFC)的一部分。 “我在声明 str1 时忘记输入 [100]。” 这不是声明,而是定义。并且定义一个数组仍然使其内容未初始化。 “当你不认识我时不要评判。” - 我不必认识作者就可以判断问题的质量和准确性。

标签: c++ winapi mfc


【解决方案1】:

你有两个问题:

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);

【讨论】:

  • 它工作正常。非常感谢您的回复。 voidPtrToFrame 的值不断变化。我可以通过static 关键字使其保持不变吗?如果是,怎么办?
  • 不,您不能这样做,因为voidPtrToFrame 由不受您控制的GetBytes 函数更新。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-14
  • 2019-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多