2014-05-02 12 views
6

Aby przetłumaczyć API puli wątków systemu Windows Vista w celu użycia w mojej aplikacji delphi. Muszę znać definicję _TP_POOL. Spojrzałem w winnt.h i stwierdzono następujące typedef deklarację:Gdzie jest definicja struktury _TP_POOL?

typedef struct _TP_POOL TP_POOL, *PTP_POOL; 

nie mogę znaleźć _TP_POOL na moich lokalnych plików nagłówkowych. Jakie jest jego położenie?

+0

Dodam znacznik Delphi, może inny programista Delphi zrobił to wcześniej. – EProgrammerNotFound

Odpowiedz

4

PTP_POOL jest nieprzezroczystym wskaźnikiem. Nigdy nie poznajesz, ani nie musisz wiedzieć, do czego odnosi się ten wskaźnik. Interfejs API puli wątków obsługuje wartości PTP_POOL po wywołaniu CreateThreadpool. Następnie przekazujesz te nieprzezroczyste wartości wskaźnika do innych funkcji API puli wątków, które wywołujesz. Implementacja interfejsu puli wątków wie, do czego odnosi się wskaźnik, ale po prostu nie trzeba.

W Delphi chciałbym zadeklarować tak:

type 
    PTP_POOL = type Pointer; 

jestem uznającej to jako odrębnego typu tak, że kompilator będzie upewnić się, że nie przypisać wskaźniki do innych typów zmiennych typu PTP_POOL .

+0

Dziękuję David. Jak zwykle byłeś bardzo pomocny. – EProgrammerNotFound

+0

Tylko w celu uzyskania w przyszłości informacji na ten temat, jak mogę zidentyfikować nieprzezroczysty wskaźnik w ten sposób? – EProgrammerNotFound

+0

Ponieważ plik nagłówkowy nigdy nie ukończyłby definicji struct. –

3

_TP_POOL jest niekompletnym typem, który nigdy nie jest kompletny w publicznych nagłówkach.

Jest to popularny idiom w języku C i C++ dla nieprzejrzystych uchwytów odpornych na typ.
Innymi słowy, są one używane do całkowitego ukrycia implementacji. Jest to prawdopodobnie najlepiej znany przykład: FILE.

3

Nie zdefiniowano. Ale biorąc pod uwagę, że TP_POOL jest zawsze przekazywany za pomocą wskaźnika (PTP_POOL), nie musisz znać jego dokładnych wewnętrznych elementów. Traktuj PTP_POOL tak, jakby został zadeklarowany jako odniesienie VOID *.

+0

Dziękuję selbie. Zastanawiam się, że, ale ponieważ nie jestem biegły w C/C++, wolę pytać, jak ryzykować zadeklarowanie jako wskaźnika. – EProgrammerNotFound