我在MSVC6里的win32 console工程里面寫了一段這樣的代碼,已經去掉了不必要的代碼已達到注意重點地目點:
#include <winbase.h>
#include <windows.h>
switch( dwWaitResult = ::SignalObjectAndWait(
m_hLogItemSendEvent,
m_hLogItemReceivedEvent,
MUTEX_LOCK_TIMEOUT,
FALSE ) )
{
case WAIT_OBJECT_0:
::ResetEvent( m_hLogItemReceivedEvent );
::ResetEvent( m_hLogItemSendEvent );
break;
case WAIT_TIMEOUT:
throw AutoLock::CAutoLockTimeoutExc( MUTEX_LOCK_TIMEOUT * 10 );
break;
default:
throw AutoLock::CAutoLockWaitExc( dwWaitResult, ::GetLastError() );
}
編譯以后,得到以下兩個錯誤:
error C2039: 'SignalObjectAndWait' : is not a member of '`global namespace''
error C2065: 'SignalObjectAndWait' : undeclared identifier
我在msdn上面已經查找到了SignalObjectAndWait在winbase里面聲明,而在windows里面定義的。但是我在上面的代碼片斷里面已經給出了相關頭文件。卻在編譯的時候出現兩個錯誤。
問題解決如下:
#if(_WIN32_WINNT >= 0x0400)
WINBASEAPI
DWORD
WINAPI
SignalObjectAndWait(
IN HANDLE hObjectToSignal,
IN HANDLE hObjectToWaitOn,
IN DWORD dwMilliseconds,
IN BOOL bAlertable
);
#endif /* _WIN32_WINNT >= 0x0400 */
在我英文操作系統里面的版本過低,導致出現無法進入上述條件編譯里面,因此需要做的事情是,要么將條件編譯注釋掉,其實問題也不大,反正以后也不會有什么變動,要么就是在stdafx.h最前面重新定義一個_WIN32_WINNT,并且這個定義值應該要大于或者等于0x0400.這樣才是okay的。
一些其他信息:
http://topic.csdn.net/u/20080429/16/c12ef43a-5eba-435e-b0bf-f49233cf1d5e.html
http://www.codeguru.com/forum/showthread.php?t=451931