2012-06-04 15 views
7

Standardowa biblioteka C++ 11 zawiera <thread>, która umożliwia tworzenie wątków. Jednak api systemu Windows wymaga identyfikatora niektórych funkcji (a mianowicie: PostThreadMessage). Jak mogę to dostać?Jak uzyskać identyfikator winapi wątku, który został utworzony przy użyciu biblioteki standardowej?

uwaga: std::thread::get_id() nie wydają się działać:

PostThreadMessage(m_thread->get_id(), WM_QUIT, 0, 0); 

e:\documents\khook\khooker\hook_runner.cpp(129): error C2664: 'PostThreadMessageW' : cannot convert parameter 1 from 'std::thread::id' to 'DWORD' 
+6

Czy działa funkcja "GetCurrentThreadId'? Nawet z innego wątku, możesz użyć tego z wewnątrz danego wątku i zapisać go, jeśli działa w pierwszej kolejności. – chris

Odpowiedz

11

Użyj funkcji składowej native_handle(). Zapewnia uchwyt rodzimej nici. Następnie możesz zadzwonić pod numer GetThreadId().

+4

Należy zauważyć, że 'native_handle()' zwraca 'UCHWYT (' void * ') dla wątku; będziesz również potrzebował 'GetThreadId()', aby uzyskać identyfikator z uchwytu, aby wywołać 'PostThreadMessage()'. –

+0

@James Dodano, dziękuję. –

0

Klasa thread::id pozwala jedynie porównanie między id s oraz wyjścia. Nie zapewnia dostępu do rzeczywistej podstawowej id. Możesz spróbować wyprowadzić go do stringstream, a następnie przeanalizować go ponownie, jak sądzę.

+0

Nie rozumiem, w jaki sposób stringstream mógłby pomóc? – qdii

+0

@Qdii, identyfikator wie, jak drukować się do strumienia (do debugowania). Wdrożenie polega tylko na wydrukowaniu wartości numerycznej. Gdy masz wartość liczbową w strumieniu strunowym, możesz ją odczytać z powrotem w typ liczbowy. –

+0

@RobKennedy: czy mogę mieć pewność, że 'thread :: id' ma taką samą wartość jak wartość api systemu Windows? (Myślałem, że może to być wartość biblioteki pośredniczącej, np. Pthread). – qdii

Powiązane problemy