Windows98 と bcc5.5.1 を使ってますが、GetSystemMetrics() は
戻ってきた時、レジスタ eax, edx, ecx を破壊していませんか?
たとえば
GetSystemMetrics(SM_CXSCREEN);
と呼んでみた時です
デバッガで、この関数の前後でのレジスタの変化をみました

この関数は
windef.h や winuser.h の中で
#define CDECL _cdecl
#define WINAPI CDECL
int WINAPI GetSystemMetrics(int nIndex);
と宣言されているようです

返り値のために eax が破壊されるのはわかるのですが
てっきり edx, ecx は保存されていると思っていた…

WINAPI は、eax, edx, ecx を破壊する呼び出し規約でしょうか?