将 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
传递给 CreateEvent
。 CreateEvent
需要 BOOL
参数,因此需要 TRUE
和 FALSE
。在我看来,传递 TRUE
/FALSE
比传递 C++ true
/false
更好,编译器需要将其转换为 BOOL
。
也不要在任何标题中或#include
之前写using namespace std;
(在你的情况下,在#include "Header.h"
之前的main.cpp 中。
【讨论】:
正如我在回答的最后一句中所写。以上是关于将 extern 关键字与 CHandle 一起用于 win32 事件的主要内容,如果未能解决你的问题,请参考以下文章
将 C++ 中的“extern C”与 ctypes 的向量一起使用