0

私は PInvoke 呼び出しの初心者です。これは十分に単純な質問のように思えますが、喜びはありません。

複数の Windows Mobile API 呼び出しを連続して行っています (アプリが既に実行されているかどうかを検出し、再度アクティブ化するため)。すべてがうまく機能しますが、正常に機能しない場合に備えてログなどを入れたかったのです。

このコードを書いているときに、呼び出しが明らかに有効な結果を返し、有効な結果が後続の呼び出しで正常に使用されている場合でもエラー コードが表示されることがわかりました (それが有効であることを証明しています)。

たとえば、現在実行中のプロセスのスナップショットへのハンドルを返す CreateToolhelp32Snapshot を呼び出します。Marshal.GetLatWin32Error をすぐに呼び出すと、無効なハンドルを意味するエラー 6 が返されます。しかし、戻り値は他のメソッドへの後続の呼び出しによって正常に使用され、プロセス全体が機能します。呼び出しの直前に Marshal.GetLatWin32Error を呼び出すと 0 が返されるため、エラー 6 を設定するのは間違いなくこの特定の呼び出しです。

Process32First と Process32Next への呼び出しは同様の動作を示します。つまり、プロセス情報を喜んで提供しますが、エラー 6 を設定することがあります。私は (と思います) これが起こっていることを知っています。これは、各呼び出しの前後にすぐに Marshal.GetLatWin32Error を呼び出すためです。後。現在、私は常に成功した結果を取得しています(後続の呼び出しで機能するハンドル、またはブール値とプロセス情報がバッファに正常にコピーされた場合は int または true の場合は 1 にキャストされる値)。

じゃあ……気にする?それはすべて機能しています....残りのプロセスで正常に使用される結果が返された場合、どのエラーが設定されるか気にしますか? 私の腸は「はい」と言っています、確かにそうですか?いずれにせよ、明らかに成功した結果が返されたのにエラーコードも設定されている場合、すべてが問題ないかどうかを実際に知るにはどうすればよいでしょうか? 有用なエラー情報を返してくれない不安定なシステムをリリースすることについて悪夢を見ています........

アップデート

これは、興味のある人のために私が話していることを説明しようとする私の 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        

コード 18 での失敗が最後のエントリに到達したことを示す Process32Next への最後の呼び出しを除いて、結果は常に true です。そして、ShowWindow がサポートされていないエラー 120 を引き起こしていることに気付いたので、その呼び出しを行います。

したがって、私の2つの実際の質問は次のとおりです。

成功したときにエラーが発生するのはなぜですか?
また、通話前と通話後のエラーが同じ場合、これが古いエラーなのか、同じエラーの 2 回目の発生なのかをどのように判断すればよいでしょうか?

4

2 に答える 2

2

CreateToolhelp32SnapshotがINVALID_HANDLE_VALUEを返さない限り、GetLastWin32Error(GetLastError)を呼び出さないでください。

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

于 2009-03-03T13:36:20.113 に答える
1

GetLastError()は、関数の呼び出しが成功するたびに0を返すことを期待しています。ただし、これは、これらの関数がエピローグでSetLastError(0)を呼び出すことを意味しますが、これは常に実行されるとは限りません。そのため、古いエラーコードと新しいエラーコードを区別することはできません。MSDNがそうするように指示した場合にのみGetLastError()を呼び出します。

于 2009-03-03T13:41:30.800 に答える