c++ - 在 C++Builder2009 中如何正确地将指针从 void* 向下转换为 TMemo*?

标签 c++ c++builder downcast tmemo

我正在 C++Builder 2009 中编写多线程套接字聊天。
按照我需要做的,它几乎完成了,但我有一个小问题。 我需要将 TMemo* 指针传递给 CreateThread WinAPI 函数,该函数将其向上转换为 void*。

我尝试过这种方式:

HANDLE xxx = MemoChat->Handle;
hNetThread = CreateThread(NULL, 0, NetThread, xxx, 0, &dwNetThreadId);
//...

然后,在 NetThread 函数中,

TMemo* MyMemo((HANDLE)lpParam);
TMemo* MyMemo((TMemo*)lpParam);

但是没用:(

问题是我如何才能真正正确地向下转换它,以便我可以在这个新线程中使用我的备忘录组件?

最佳答案

调用:

TMemo*     MemoChat   = // You defined that somewhere I assume
HANDLE     hNetThread = CreateThread(NULL, 0, NetThread, MemoChat, 0, &dwNetThreadId);

这里发生的情况是,作为第三个参数传递的任何指针都会自动转换为 void 指针(或在 WinTerms LPVOID 中)。没关系,它不会改变它,它只是丢失了类型信息,因为系统不知道有关您的对象的任何信息。

新的线程起点:

DWORD NetThread(LPVOID lpParameter)
{
    TMemo*   MemoChat   = reinterpret_cast<TMemo*>(lpParameter);
    // Do your thread stuff here.
}

一旦调用线程启动方法。只需将 void 指针转换回正确的类型,您就可以再次开始使用它。

只是为了消除其他误解。

HANDLE 是一个指针
您可以将其作为参数传递给 NetThread()。

句柄是一个在系统控制下指向您正在使用的对象的指针。那么为什么要使用双重间接呢?它允许系统移动对象(并更新其指针),而无需找到对象的所有所有者。所有者都有指向刚刚更新的指针的句柄。

这是一个老式的计算机科学概念,由于操作系统/硬件能够将主内存交换到辅助存储,因此在现代计算机中很少使用。但对于某些资源它们仍然有用。如今,当需要 handle 时,它们被隐藏在远离用户的物体内部。

关于c++ - 在 C++Builder2009 中如何正确地将指针从 void* 向下转换为 TMemo*?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/274841/

相关文章:

c++ - 为什么不总是将返回值分配给 const 引用?

c++ pound 定义只有一个参数

windows - C++Builder XE5 调试器显示???用于调用堆栈中的监视和函数参数

dictionary - 在 Swift 中从字典中读取时向下转换元素

c++ - dynamic_cast 向下转型 : How does the runtime check whether Base points to Derived?

c++ - 在 C++ 中使用 cin 时内存损坏

c++ - bcc32 : strange error when specialising on `std::vector<bool>`

c++ - 异步输入输出/获取前缀后的输入

java - 如果方法是抽象的,是否需要向下转换?

c++ - 使用 CMake 和 Visual Studio 构建 LLVM 安装失败,