将 extern 关键字与 CHandle 一起用于 win32 事件

Posted

技术标签:

【中文标题】将 extern 关键字与 CHandle 一起用于 win32 事件【英文标题】:use of extern keyword with CHandle for win32 events 【发布时间】:2015-11-20 09:56:06 【问题描述】:

我正在尝试跨 2 个文件使用 win32 事件。所以我使用外部。 基本上我是从主线程发出一个线程,线程过程在不同的文件中。 我收到一些错误消息:未解析的外部符号:

ThreadProcedure.cpp:

#include<process.h>
#include<afxmt.h>
#include<afxwin.h>
#include<iostream>
using namespace std;

UINT __cdecl MyThreadProc(LPVOID lpParameter)


    extern CHandle hEvent;
    cout << "waiting for getting signal..." << endl;
    DWORD ret = WaitForSingleObject(hEvent, INFINITE);
    cout << "signaled" << endl;
    // Terminate the thread
    ::AfxEndThread(0, FALSE);
    return 0L;

main.cpp:

#include<iostream>
#include<process.h>
#include<afxmt.h>
#include<afxwin.h>
using namespace std;
#include"Header.h"

UINT __cdecl MyThreadProc(LPVOID lpParameter);
HANDLE     hEvent;

void main()


    hEvent = CreateEvent(NULL, true, false, L"AnEvent");

    CWinThread* pThread;
    pThread = ::AfxBeginThread(&MyThreadProc, NULL, 0, 0, CREATE_SUSPENDED, NULL);
    pThread->m_bAutoDelete = FALSE;
    pThread->ResumeThread();

    ::WaitForSingleObject(pThread->m_hThread, INFINITE);
    delete pThread;

    system("pause");

错误:

错误 LNK2001:无法解析的外部符号“class ATL::CHandle hEvent”(?hEvent@@3VCHandle@ATL@@A)

【问题讨论】:

What is an undefined reference/unresolved external symbol error and how do I fix it?的可能重复 【参考方案1】:

在 main.cpp 中定义一个 HANDLE hEvent,在 ThreadProcedure.cpp 中声明一个 extern CHandle hEvent。当然,这些并不相同。所以链接器是对的,他没有找到任何CHandle hEvent,只有一个HANDLE hEvent。您需要在声明中(在 ThreadProcedure.cpp 中)和在定义中(在 main.cpp 中)给出相同的类型。

ThreadProcedure.cpp:

extern HANDLE hEvent;

关于您的代码的其他一些说明:您将 C++ bool true/false 传递给 CreateEventCreateEvent 需要 BOOL 参数,因此需要 TRUEFALSE。在我看来,传递 TRUE/FALSE 比传递 C++ true/false 更好,编译器需要将其转换为 BOOL

也不要在任何标题中或#include 之前写using namespace std;(在你的情况下,在#include "Header.h" 之前的main.cpp 中。

【讨论】:

正如我在回答的最后一句中所写。

以上是关于将 extern 关键字与 CHandle 一起用于 win32 事件的主要内容,如果未能解决你的问题,请参考以下文章

将 C++ 中的“extern C”与 ctypes 的向量一起使用

如何编译多个 C++ 文件以将它们与 Python ctypes 一起使用?

定义与声明头文件与extern总结

extern 用法,全局变量与头文件(重复定义)

extern关键字祥解

通过项目实践带你彻底搞懂C/C++编程中static与extern两关键字的使用