1

I have a program in .Net 4.5 using ICorDebug::CreateProcess (http://msdn.microsoft.com/en-us/library/vstudio/ms232508.aspx). It work on Windows XP, Vista, 7, but not on Windows 8 : my program stop without any message, even in debug mode. But, the same program, in .Net 4.0, work correctly on Windows 8.

Any idea about this?

Thank in advance :)

4

3 回答 3

2

我不确定这是否有助于诊断这个问题,但我在 Windows 8 上也发生了类似的事情。

我们有一些旧版 VB6 应用程序正在尝试在 Win 8 上进行测试。

一些应用程序使用 CreateProcessA 运行其他 VB6 应用程序。有些带参数,有些不带参数 - 通常命令行参数指向在 %temp% 中创建的参数文件。

其中大多数运行良好。但是,其中一些根本不会运行。CreateProcessA 返回零。

但是,如果我在 VB 中检查 err.LastDLLError,它会返回 740,这意味着“进程需要提升”。

如果我使用 ShellExecute,它可以正常工作 - 而且 UAC 不会要求提升!

我不知道为什么这几个程序会有这样的行为,因为,正如我所提到的,我认为同样复杂的其他程序可以使用 CreateProcessA 运行得很好。

顺便说一句 - 这些程序在打开或关闭 UAC 的 XP、Vista 和 Win 7 下完美运行。并且它们中的任何一个都不需要升高。

但是 - 底线是 ShellExecute 似乎运行正常,所以我建议发帖者尝试它而不是 CreateProcess。

于 2012-10-16T15:35:39.350 回答
1

正如承诺的那样,我将在私人电子邮件中回复 Etienne(感谢 Etienne 提供复制信息)

我相信您在 64 位 Windows 8 机器中运行,并且默认情况下 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 也已过时,您希望使用 ICLRRuntimeInfo::GetInterface 来创建 ICorDebug 接口。您可以参考 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 回答