簡體   English   中英

Windows Mobile API調用-成功-但GetLastWin32Error返回錯誤代碼-我應該擔心嗎?

[英]Windows Mobile API calls - success but GetLastWin32Error returns error code - should I be worried?

我是PInvoke通話的新手。 我已經用谷歌搜索了這個問題,因為這似乎是一個簡單的問題,但沒有喜悅。

我連續進行多個Windows Mobile API調用(以檢測我的應用程序是否已在運行,然后重新激活它)。 一切都很好,但我想在無法正常工作的時候輸入日志記錄。

在編寫此代碼時,我發現即使我的調用顯然返回了有效結果並且后續調用成功使用了有效結果(我認為這是有效的),我也會收到錯誤代碼。

例如,我叫CreateToolhelp32Snapshot,它為我提供了當前正在運行的進程快照的句柄。 返回錯誤6后立即調用Marshal.GetLatWin32Error,這顯然意味着無效的句柄。 但是,隨后對其他方法的調用成功地使用了返回值,並且整個過程正常進行。 肯定是這個特定的調用設置了錯誤6,因為如果在調用之前調用Marshal.GetLatWin32Error,它將返回0。

調用Process32First和Process32Next表現出相似的行為,即它們愉快地為我提供了過程信息,但有時會設置錯誤6。后。 當前,我總是能獲得成功的結果(可以用於后續調用的句柄,如果是int則將值強制轉換為1,如果將bool和進程信息成功復制到緩沖區中則將其強制轉換為true)。

所以.....我應該在乎嗎? 一切正常。...如果我得到在其余過程中成功使用的結果,我是否在乎會設置什么錯誤? 我的直覺說可以,是嗎? 無論哪種方式,如果我顯然獲得了成功的結果但還設置了錯誤代碼,我如何才能真正知道一切是否正常? 我夢about以求地發布了一個不穩定的系統,該系統不會給我有用的錯誤信息。

更新

這是我的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        

結果始終為true,但最后一次調用Process32Next時,代碼為18的失敗表明已到達最后一個條目。 而且我剛剛注意到ShowWindow導致錯誤120,該錯誤不受支持,因此我將其撤出。

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

為什么成功時會出錯?
而且,當呼叫前和呼叫后錯誤相同時,我怎么知道這是舊錯誤還是第二次出現同一錯誤?

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

看到 http://msdn.microsoft.com/zh-CN/library/ms682489(VS.85).aspx

您期望GetLastError()在每次成功調用任何函數后返回0。 但是,這意味着那些函數在其結尾中調用SetLastError(0)並非總是如此。 這就是為什么您無法區分舊錯誤代碼和新錯誤代碼的原因。 僅在MSDN告訴您這樣做的情況下才調用GetLastError()。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM