c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?


【资料图】

vlc.exe.lnk双击这个文件,能正常打开vlc,但是用System.Diagnostics.Process.Start(Path.GetFullPath("vlc.exe.lnk"), url);没有任何反应。根据常理,不应该出现这个问题。但是现实就是这么魔幻,偏偏有这个问题。

根据上面图,根据快捷方式是可以获取到vlc可执行文件的路径的,然后在网上搜索到这段代码,如下:

// 引用→添加引用→左侧菜单的 COM 选项→勾上 Microsoft Shell Controls And Automationusing Shell32;namespace FD.WinformUI{    public class UICommon    {        // 传入快捷方式文件的路径,返回目标 exe 文件的路径        public string GetExePathFromShortcut(string shortcutFilePath)        {            FileInfo fileInfo = new FileInfo(shortcutFilePath);            string targetPath = "";            if (fileInfo.Extension.ToLower() == ".lnk") // 判断是否为快捷方式文件            {                Shell shell = new Shell();                Folder folder = shell.NameSpace(fileInfo.DirectoryName);                FolderItem folderItem = folder.ParseName(fileInfo.Name);                if (folderItem != null)                {                    ShellLinkObject link = (ShellLinkObject)folderItem.GetLink;                    targetPath = link.Target.Path; // 获取目标 exe 文件的路径                }            }            else if (fileInfo.Extension.ToLower() == ".url") // 判断是否为网址快捷方式            {                using (StreamReader reader = new StreamReader(shortcutFilePath))                {                    string line;                    while ((line = reader.ReadLine()) != null)                    {                        if (line.StartsWith("URL=", StringComparison.OrdinalIgnoreCase))                        {                            targetPath = line.Substring(4).Trim();                            break;                        }                    }                }            }            return targetPath;        }    }}

调用上面的函数UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")),得到的路径是 "C:\Program Files (x86)\VideoLAN\VLC\vlc.exe" ,而这个路径根本不存在,这应该是c#画蛇添足了,要去掉" (x86)"。用System.Diagnostics.Process.Start(@"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe", url);这样就能调用了,算是解决了这个问题。

后来我尝试用System.Diagnostics.Process.Start(UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")), url);结果又傻眼了,发现调用了这个函数,vlc根本无法启动。后来打印日志,发现日志卡住了,这意思就是程序卡住了。后来干脆在项目的主函数里调用System.Diagnostics.Process.Start(UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")), url);结果vlc能启动,并且能正常打开http的url。

在主函数里可以,在项目的其他代码里不行,这非常奇怪。后来发现项目的其他代码里新开启了线程,怀疑是线程的问题。因此我在主函数里开启线程,然后在线程里调用System.Diagnostics.Process.Start(UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")), url);测试结果是vlc无法启动。

这充分证明了我的猜想,UICommon.Instance.GetExePathFromShortcut(Path.GetFullPath("vlc.exe.lnk")这个方法只能在主线程里运行,在其他线程里无法运行。我在chatgpt里问了下,chatgpt回复的如下:

1.该方法需要在主线程中执行。因为 Shell32 命名空间对应的 COM 组件在内部使用了单线程模型(Single-Threaded Apartment, STA),必须在 UI 线程中执行,否则会抛出异常。

2.如果你想在新线程中调用该方法,可以考虑将该方法封装到一个带有返回值的委托中,并使用 Control.Invoke() 或者 Control.BeginInvoke() 方法将其运行在 UI 线程中。

最终的解决方案,不用根据快捷方式获取程序路径,在调用System.Diagnostics.Process.Start(Path.GetFullPath("vlc.exe.lnk"), url)之前,先判断"C:\Program Files (x86)\VideoLAN\VLC\vlc.exe"和"C:\Program Files\VideoLAN\VLC\vlc.exe"是否存在。如果存在,就直接用已经存在的vlc路径;如果不存在,就用"vlc.exe.lnk"这个快捷方式。

关键词:

为您推荐

c#中用System.Diagnostics.Process.Start(Path.GetFullPath(“vlc.exe.lnk“), url);用vlc的快捷方式打开http的url不起作用?

vlc exe lnk双击这个文件,能正常打开vlc,但是用System Diagnostics Process Start(Path GetFullPath("vlc

来源:博客园2023-05-24

泰禾第四次发布退市风险公告,尚未形成全面债务重组解决方案|全球讯息

24小时财经资讯平台,依托新锐财经日报《每日经济新闻》(NationalBusinessDaily),打造中国最具影响力的经

来源:每日经济新闻2023-05-24

周四或还有下探关键看周五

今周三股指低开后下探,后盘中虽有反弹但无力后再次下探,最终以大跌41 49点收盘,也是盘中最低点于3204 7

来源:中金在线财经号2023-05-24

法网创纪录!意大利三杰团战德纳费,小威廉姆斯冲击八强

第7比赛日的焦点人物当然是三巨头,德约科维奇和纳达尔赢得相当轻松,均以3-0过关。有意思的是,三巨头下一

来源:生活帮帮团2023-05-24

全球观点:10岁男童失联20天身亡,“生母继父将其埋在他人坟里”,知情人:孩子学习特别好,继父疑有家暴倾向

据奔流新闻报道,5月23日,失联20天后,山西临猗县一10岁男孩被发现身亡。记者从临猗警方获悉,目前两名嫌

来源:九派新闻2023-05-24

环球快看点丨中国在南沙群岛设3座灯浮标,专家解读来了!

中国交通运输部24日发布消息称,中国已在南沙群岛火艾礁、牛轭礁和南薰礁附近海域布设3座灯浮标。南海问题

来源:北京日报2023-05-24

黄河明珠水利水电:中标新疆阜康抽水蓄能电站吊物孔一体化盖板采购项目

近日,黄河明珠水利水电建设有限公司成功中标新疆阜康抽水蓄能电站吊物孔一体化盖板采购项目。阜康抽水蓄能

来源:黄河明珠水利水电建设有限公司2023-05-24

全球观天下!即时需求多 跑腿服务忙

即时需求多跑腿服务忙

来源:人民日报海外版2023-05-24