2009-03-03 35 views
0

我是PInvoke調用的新手。我已經使用了這個詞,因爲它看起來像一個簡單的問題,但沒有喜悅。Windows Mobile API調用 - 成功,但GetLastWin32Error返回錯誤代碼 - 我應該擔心嗎?

我在一行中進行多個Windows Mobile API調用(檢測我的應用程序是否已在運行,然後重新激活它)。一切工作正常和花花公子,但我想在日誌記錄等等,當它不能正常工作。

在寫這個代碼,我發現,我會得到錯誤代碼,即使我的電話顯然返回一個有效的結果和有效結果的後續調用成功地使用(證明它是有效的,我認爲)。

例如我打電話給CreateToolhelp32Snapshot,它讓我回到當前正在運行的進程的快照的句柄。調用Marshal.GetLatWin32Error immediatley後返回錯誤6顯然意味着無效句柄。但是,隨後對其他方法的調用會成功使用返回的值,並且整個過程都能正常工作。這絕對是這個特殊的調用設置錯誤6,因爲如果你在調用之前調用Marshal.GetLatWin32Error,它返回0.

調用Process32First和Process32Next表現出類似的行爲,即它們給予我愉快的過程信息,但有時會設置錯誤6. I (想)我知道這是因爲我打電話Marshal.GetLatWin32Error immediatley之前和之後每次通話有時它是0之前和6之後。目前我總是得到一個成功的結果(或者是後續調用的句柄,或者是一個值,如果爲int,則該值爲1,如果bool和過程信息成功複製到緩衝區中,則值爲true)。

所以......我應該關心嗎?這一切都工作....我是否關心什麼錯誤得到設置,如果我得到的結果,其餘的過程中成功使用的結果?我的直言不諱,我確實這樣做?無論哪種方式,如果我顯然獲得了成功的結果,但是又設置了錯誤代碼,我怎麼才能真正知道一切是否正常?我有大約釋放,將不會給我有用的錯誤信息反饋系統不穩定惡夢........

UPDATE

這是我loggong代碼的結果,試圖說明什麼我正在談論任何感興趣的人。簡而言之,代碼將檢查自身已運行的副本,然後檢查客戶端的已運行副本,然後在找到客戶端時重新激活客戶端。

Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 0, Post-call error code: 6 
Method name: Process32First, Result: True, Pre-call error code: 6, Post-call error code: 6    
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 6     
Method name: Process32Next, Result: True, Pre-call error code: 6, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                    
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18    
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 6  
Method name: CreateToolhelp32Snapshot, Result: 605618176, Pre-call error code: 6, Post-call error code: 0 
Method name: Process32First, Result: True, Pre-call error code: 0, Post-call error code: 0    
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0     
Method name: Process32Next, Result: True, Pre-call error code: 0, Post-call error code: 0                  
Method name: Process32Next, Result: False, Pre-call error code: 0, Post-call error code: 18    
Method name: CloseToolhelp32Snapshot, Result: True, Pre-call error code: 18, Post-call error code: 0  
Method name: ShowWindow, Result: True, Pre-call error code: 0, Post-call error code: 120     
Method name: SetForegroundWindow, Result: True, Pre-call error code: 120, Post-call error code: 6   

除了最後一次調用Process32Next,其中代碼爲18的失敗表明已達到最後一項,結果始終爲真。我剛剛注意到ShowWindow導致錯誤120,這是不支持,所以我會採取這種呼籲。

所以我的兩個實際問題是:

爲什麼錯誤當我成功了?
而且,當通話前和通話後的錯誤是相同的,我怎麼知道這是舊錯誤還是第二次發生同樣的錯誤?

回答

2

除非CreateToolhelp32Snapshot返回INVALID_HANDLE_VALUE,否則不應該調用GetLastWin32Error(GetLastError)。

http://msdn.microsoft.com/en-us/library/ms682489(VS.85).aspx

+0

這是我沒有得到的位。鏈接並沒有說如果你得到INVALID_HANDLE_VALUE,你只能*調用GetLastWin32Error。 GetLastWin32Error的文檔說它存儲來自上次PInvoke調用的錯誤,其中SetError爲真。在這種情況下,最後一個錯誤是小說的作品嗎? – 2009-03-03 14:37:52

+0

還是隻是它沒關係,除非你按照MSDN的規定取回角蛋白值? – 2009-03-03 14:43:17

1

您預計GetLastError()可任意功能的每次成功調用後返回0。但這意味着這些函數在它們的結尾調用SetLastError(0)並不總是完成。這就是爲什麼你無法區分舊的錯誤代碼和新的錯誤代碼。只有調用GetLastError()MSDN告訴你這樣做的情況。

相關問題