2013-07-27 40 views
1

winapi中的某些結構在每個Windows版本中都有其他成員。P /調用條件結構

typedef struct MyStruct 
{ 
int cbSize; 
int a; 
int b; 
#if _WIN32_WINNT >= 0x0600 
int c; 
int d; 
#endif 
} MyStruct, *PMyStruct; 

當我端口這對C#是確定以定義所有成員(CBSIZE,A,B,C,d),並通過該結構作爲參數在一些pinvoked功能,還是應該我定義爲XP較小結構?

回答

2

如果您需要支持Windows XP,那麼您只需要使用Windows XP中定義的字段。問題不是結構的大小,而是價值cbSize。如果它與API預期的值不匹配,那麼API調用將失敗。因此,傳遞更大的Vista版本的struct的cbSize會導致API失敗(這是返回失敗代碼,它不會崩潰)。

如果您需要您可以檢測到您正在運行的Windows版本並傳遞Windows版本的期望大小(您可以傳遞較大的大小的結構,Windows將忽略額外的字節)但你只需要這樣做,如果你需要在Vista +上填寫cd

請參閱this blog post爲什麼發送較大的cbSize被拒絕。

+0

如果我通過完整的結構與更小的cbSize,不會c,d字段損壞函數的其他參數? WinapiFunc(theStruct,arg2,arg3); – albert

+0

@albert,不,因爲API需要一個指向結構的指針。調用堆棧中唯一的東西是指針值 - 無論指向哪個結構的大小。 p/Invoke定義應該使用'ref struct'來表示這一點。請參閱http://www.pinvoke.net/default.aspx/user32/GetWindowInfo.html和http://msdn.microsoft.com/en-us/library/windows/desktop/ms633516(v=vs.85)。 ASPX – shf301