有人能幫助我理解爲什麼Win32錯誤代碼與方法簽名不匹配,以及處理此問題的正確方法是什麼?爲什麼Win32錯誤代碼與方法簽名不匹配?
以SCardReleaseContext爲例,根據MSDN文檔,返回類型爲LONG
。根據this MSDN article,LONG
的c#等效值爲int
。查看SCardReleaseContext的一些p/invoke example signatures,返回類型也被標記爲int
。
但是,WinSCard error codes的定義與int
類型不符,因爲該值根本不適合int
。
目前,在我的c#程序中,我必須將返回值和錯誤代碼值定義爲uint
。這樣我的代碼編譯和工作。否則,編譯器會抱怨該值無法轉換爲int,例如 - enum ErrorCodes : int { SCARD_E_CANCELLED = 0x80100002 }
。
我可以正確地假設C++編譯器將取值0x80100001(不適合int),讓它溢出,從而將該值轉換爲一些適當的匹配負值?
另外,我是否正確地說c#編譯器不會允許編寫這樣的錯誤/缺陷/缺陷,並且處理這個(角落)情況的正確方法是有目的地「制動」p/invoke簽名而用uint
代替?
編輯:
固定的最後一個環節,這是那種不正確的,在它的值轉換爲DWORD
,這恰好是uint
。將鏈接設置爲指向Microsoft自己的站點。
DWORD是一個單元,所以你的課程價值非常適合。在我的最後一個鏈接中,我犯了一個錯誤,其中的值被轉換爲DWORD。我現在指向微軟自己的網站的鏈接。我的抱怨是微軟聲明瞭int的返回值,但是對於錯誤代碼提供的值不適合int ... – Marko 2012-04-06 12:40:26
@Marko它取決於觀點。對我來說它適合int,因爲它有32位。 – 2012-04-06 13:16:43
你對這個觀點有點正確。但對我來說,微軟的觀點是有缺陷的。爲什麼指定一個會溢出數據類型的返回值?爲什麼不指定一個負值(溢出的結果)開始?指定溢出值是違反直覺的,而不是邏輯的... – Marko 2012-08-29 20:27:40