Sdílet prostřednictvím


STRIKTNÍ dodržování předpisů

Pokud povolíte STRICT kontrolu typů, může se stát, že zdrojový kód úspěšně zkompiluje chybové zprávy. Následující části popisují minimální požadavky na kompilaci kódu při povolení STRICT. Doporučuje se další kroky, zejména pro vytváření přenosného kódu.

Obecné požadavky

Hlavním požadavkem je, že musíte deklarovat správné typy popisovačů a ukazatelů funkce, a nemusíte se spoléhat na obecnější typy. Nelze použít jeden typ popisovače, kde se očekává jiný. To také znamená, že možná budete muset změnit deklarace funkcí a použít více přetypování typů.

Nejlepších výsledků dosáhnete tak, že obecný typ POPISOVAČ se použije jenom v případě potřeby.

Deklarace funkcí v rámci vaší aplikace

Ujistěte se, že jsou deklarovány všechny funkce aplikace. Umístění všech deklarací funkcí do souboru include se doporučuje, protože můžete snadno prohledat deklarace a vyhledat parametry a návratové typy, které by se měly změnit.

Pokud k vytváření souborů hlaviček pro funkce použijete možnost /Zg, mějte na paměti, že se vám zobrazí různé výsledky v závislosti na tom, jestli jste povolili kontrolu typů STRICT. Když STRICT zakázáno, všechny typy popisovačů generují stejný základní typ. S povolenými STRICT generují různé základní typy. Chcete-li předejít konfliktu, je nutné znovu vytvořit soubor záhlaví pokaždé, když povolíte nebo zakážete STRICT, nebo upravit soubor hlaviček tak, aby používal typy HWND, HDC, HANDLEatd. místo základních typů.

Všechny deklarace funkcí, které jste zkopírovali z Windows.h do zdrojového kódu, se mohly změnit a vaše místní deklarace může být za aktuální. Odeberte místní deklaraci.

Typy, které vyžadují přetypování

Některé funkce mají obecné návratové typy nebo parametry. Například funkce SendMessage vrací data, která mohou být libovolným počtem typů v závislosti na kontextu. Když ve zdrojovém kódu uvidíte některou z těchto funkcí, ujistěte se, že používáte správné přetypování typů a že je co nejsrozhodnější. Následující seznam je příkladem těchto funkcí.

Při volání SendMessage, DefWindowProc, nebo SendDlgItemMessage, měli byste nejprve přetypovat výsledek na typ UINT_PTR. Je potřeba provést podobné kroky pro libovolnou funkci, která vrací LRESULT nebo LONG_PTR hodnotu, kde výsledek obsahuje popisovač. To je nezbytné pro psaní přenosného kódu, protože velikost úchytu se liší v závislosti na verzi Windows. Přetypování (UINT_PTR) zajišťuje správný převod. Následující kód ukazuje příklad, ve kterém SendMessage vrátí popisovač do štětce:

HBRUSH hbr;

hbr = (HBRUSH)(UINT_PTR)SendMessage(hwnd, WM_CTLCOLOR, ..., ...);

Parametr CreateWindow a CreateWindowExhmenu se někdy používá k předání identifikátor u ovládacího prvku integer (ID). V tomto případě je nutné přetypovat ID na typ HMENU:

HWND hwnd;
int id;

hwnd = CreateWindow(
        TEXT("Button"), TEXT("OK"), BS_PUSHBUTTON,
        x, y, cx, cy, hwndParent,
        (HMENU)id,    // Cast required here
        hinst,
        NULL);

Další důležité informace

Pokud chcete získat největší výhodu z STRICT kontroly typů, měli byste postupovat podle dalších pokynů. Kód bude v budoucích verzích Windows přenosnější, pokud provedete následující změny.

Typy WPARAM , LPARAM, LRESULTa LPVOID jsou polymorfních datových typů. Uchovávají různé druhy dat v různých časech, i když je povolená kontrola typů STRICT. Pokud chcete získat výhodu kontroly typů, měli byste co nejdříve přetypovat hodnoty těchto typů. (Všimněte si, že zprávy crackers automaticky přesílat wParam a lParam pro vás přenositelným způsobem.)

Dávejte pozor na rozlišení HMODULE a typů HINSTANCE. I v případě STRICT jsou definovány jako stejný základní typ. Většina funkcí správy modulů jádra používá typy HINSTANCE, ale existuje několik funkcí, které vracejí nebo přijímají pouze typy HMODULE.

Zakázání striktního

povolení striktního