1

ICorDebug::CreateProcesshttp://msdn.microsoft.com/en-us/library/vstudio/ms232508.aspx )を使用して.Net4.5にプログラムがあります。Windows XP、Vista、7では動作しますが、Windows 8では動作しません。デバッグモードでも、プログラムはメッセージなしで停止します。ただし、.Net 4.0の同じプログラムは、Windows8でも正しく機能します。

これについて何か考えはありますか?

少し早いですがお礼を :)

4

3 に答える 3

2

これがこの問題の診断に役立つかどうかはわかりませんが、Windows8でも同様のことが起こっています。

Win8でテストしようとしているレガシーVB6アプリがいくつかあります。

一部のアプリは、CreateProcessAを使用して他のVB6アプリを実行します。パラメータのあるものとないものがあります。通常、コマンドラインparmは、%temp%で作成されたパラメータファイルを指します。

これらのほとんどは問題なく動作します。ただし、それらのいくつかはまったく実行されません。CreateProcessAはゼロを返します。

しかし、VBでerr.LastDLLErrorをチェックすると、「プロセスには昇格が必要」を意味する740が返されます。

ShellExecuteを使用すると、正常に機能します。UACは昇格を要求しません。

なぜこれらのいくつかのプログラムがこのように動作するのかわかりません。前述したように、私が同じように複雑だと感じる他のプログラムは、CreateProcessAで問題なく実行されるからです。

ところで-これらのプログラムは、UACがオンまたはオフの状態で、XP、Vista、およびWin7で完全に実行されます。そして、それらのいずれにも標高は必要ありません。

しかし、最終的にはShellExecuteは正常に実行されているように見えるので、CreateProcessの代わりに試してみることをポスターに勧めます。

于 2012-10-16T15:35:39.350 に答える
1

約束通り、私はエティエンヌへの返信をプライベートメールで投稿しています(リプロ情報を提供してくれたエティエンヌに感謝します)

64ビットのWindows8ボックスで実行していると思います。デフォルトでは、Visual Studioは、指定されていない限り、管理対象プロセスを64ビットプロセスとしてビルドおよび実行します。x86プラットフォーム用のサンプルをビルドして実行しても、サイレントクラッシュは発生しません。代わりに、エラーのあるダイアログボックスがスローされます。

__CreateProcess定義では、パラメータータイプとしてuintを使用しています。64ビットプロセスとして実行している場合、アドレスフィールドは64ビットであり、uintを使用すると切り捨てられます。これにより、アクセス違反が発生し、アプリケーションが失敗します。両方のビットネスで両方で機能するIntPtrを使用する必要があります。

[MethodImpl(MethodImplOptions.InternalCall, MethodCodeType = MethodCodeType.Runtime)]
void __CreateProcess(
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpApplicationName, 
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpCommandLine, 
     [In] ref _SECURITY_ATTRIBUTES lpProcessAttributes, 
     [In] ref _SECURITY_ATTRIBUTES lpThreadAttributes, 
     [In] int bInheritHandles, [In] uint dwCreationFlags, 
     [In] IntPtr lpEnvironment, 
     [In, MarshalAs(UnmanagedType.LPWStr)] string lpCurrentDirectory, 
     [In, ComAliasName("Debugger.Interop.CorDebug.ULONG_PTR")] uint lpStartupInfo, 
     [In, ComAliasName("Debugger.Interop.CorDebug.ULONG_PTR")] uint lpProcessInformation, 
     [In] CorDebugCreateProcessFlags debuggingFlags, 
     [MarshalAs(UnmanagedType.Interface)] out ICorDebugProcess ppProcess);

また、API CreateDebuggingInterfaceFromVersionは廃止されており、ICorDebugインターフェイスを作成するためにICLRRuntimeInfo::GetInterfaceを使用する必要があります。コードサンプルについては、CLRマネージデバッガーサンプルを参照してください。

それでも問題が解決しない場合はお知らせください。

結論:これは、.NET4または.NET4.5とは関係のないメモリの破損です。失敗はランダムです。メモリの破損が原因で、アプリが.NET4でランダムに失敗した可能性があります。たまたま、.NET4.5でより早く失敗が発生しました。

于 2012-10-18T20:31:05.937 に答える
0

みなさん、ありがとうございました。問題は解決されました。ICorDebugのCreateProcess関数の引数とその派生物に問題がありました。user1748224と同じ問題が発生する可能性があるかどうかをテストするために、マニフェストを変更しました。プロジェクトに管理者権限がない場合は、user1748224と同じメッセージが表示されます。VB6でどのように機能するかはわかりませんが、.Netでは、この問題を回避するために、メインアプリケーションのマニフェストを変更する必要があります。

もう一度ありがとう:)

于 2012-10-17T07:34:53.437 に答える