【发布时间】:2013-11-08 15:51:08
【问题描述】:
我有一个非常旧的程序,我无法控制。它使用它的默认应用程序启动一个文件类型,如下所示(我无法修改此代码):
LET Err (SHELL_EXECUTE 'open' (FIX_MESG '"{1}"' File_name) '' '')
^^上述代码有效,只要该文件类型不与 ClickOnce 程序相关联。
旧程序是 32 位,操作系统是 Windows 7 64 位。我可以将我的 clickonce 程序编译为任何程序,但似乎没有一个有效。 (我试过 x86、x64 和 anyCPU)
如何让 32 位程序使用 shell 执行在 64 位操作系统上启动 ClickOnce 程序?
更多详情: 这是一个可重现的错误。构建 2 个程序。程序 1 是 Clickonce 程序。将其与任何文件类型相关联。程序 2 将执行一个 shell 执行命令来打开 clickonce 程序关联的任何文件类型。如果你将程序 2 编译为 x86,它会给你一个成功的响应,但什么也不做。
控制台shell执行程序的测试代码:
private static void Main()
{
int value = ShellExecuteA(IntPtr.Zero, "open", @"C:\Users\bsee\Desktop\testfile.ecn2", "", "", 0);
if (value > 32)
MessageBox.Show("Clickonce reports success. But did it actually start?");
}
[DllImport("Shell32.dll")]
public static extern int ShellExecuteA(IntPtr hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirecotry, int nShowCmd);
【问题讨论】:
-
我看不出这是一个 C# 问题。
-
'似乎没有工作' - 是否有错误消息?你能看到任何从任务管理器开始的东西吗?
-
@Rikalous 没有错误消息。事实上,shell_execute 在测试时返回一个超过 32 的值,这在技术上意味着成功。
-
@OndrejJanacek 可能不是。 clickonce 应用程序是 C#。如果有任何可能是特定于语言的错误,我想我会探索这种可能性。
-
@Rikalous 线程中接受的答案建议了一个调用实际文件的批处理文件。这不会修改现有程序。是否有什么原因导致此解决方案对您不成功?
标签: c# clickonce shellexecute