相关疑难解决方法(0)

从.NET Windows服务调用Shell32.dll

我有一个.NET 4.0库,它使用Shell32和Folder.GetDetailsOf()从WTV文件中获取元数据.我已成功使用它与控制台和Windows窗体应用程序没有问题.但由于某种原因,从.NET 4.0 Windows服务调用组件时,启动Shell类的调用会导致COM错误.

库中失败的代码:

Shell32.Shell shell = new Shell();

错误:

无法将"System .__ ComObject"类型的COM对象强制转换为接口类型"Shell32.Shell".此操作失败,因为对IID为"{286E6F1B-7113-4355-9562-96B7E9D64C54}"的接口的COM组件的QueryInterface调用由于以下错误而失败:不支持此类接口(HRESULT异常:0x80004002(E_NOINTERFACE)) .

我阅读了我的公寓线程,COM Interops,动态,PIA等等,但是我找到的解决方案没有解决问题.它必须是来自另一个无法看到Interop的线程的调用.请帮忙 :)

.net c# com multithreading shell32

10
推荐指数
2
解决办法
7030
查看次数

如何从文件快捷方式获取路径名?获得例外

可能重复:
获取快捷方式文件夹的目标

例如,在C:\TEMP\我有一个名为test.dll快捷方式的快捷方式将导致文件名test.dll

我想从快捷方式只获取路径名到它自己的文件.所以,我在另一个递归函数中调用此函数,并在每次从我的硬盘中的另一个目录中放入此函数.

例如,第一个目录C:\TEMP就在C:\TEMP那里有快捷方式文件,我只想获取文件的路径.在C:\TEMP测试中,我现在有3个文件:

hpwins23.dat
hpwmdl23.dat
hpwmdl23.dat - Shortcut(C:\TEMP\hpwmdl23.dat)

所以,我想得到的是快捷方式的路径名,本例中是C:\ TEMP

我试着使用这个功能:

public string GetShortcutTargetFile(string shortcutFilename)
        {
            string pathOnly = System.IO.Path.GetDirectoryName(shortcutFilename);
            string filenameOnly = System.IO.Path.GetFileName(shortcutFilename);
            Shell shell = new Shell();
            Folder folder = shell.NameSpace(pathOnly);
            if (folder == null)
            {
            }
            else
            {
                FolderItem folderItem = folder.ParseName(filenameOnly);
                if (folderItem != null)
                {
                    Shell32.ShellLinkObject link = (Shell32.ShellLinkObject)folderItem.GetLink;
                    return link.Path;
                }
            }
            return string.Empty;
        }
Run Code Online (Sandbox Code Playgroud)

但是当我使用该函数并且它到达一个快捷方式时,我遇到异常错误:

Shell32.ShellLinkObject link …
Run Code Online (Sandbox Code Playgroud)

c# windows-shell

9
推荐指数
1
解决办法
2万
查看次数

如何访问.URL文件中的URL和书签标题?

我正在使用.NET 2.0 Visual Studio 2005 C#.

下面的代码从包含书签.url文件的目录中获取IE收藏夹(书签)的文件名

../users/favorites/blah.url

但我真正想要的是该文件中的书签URL.

检查文件属性时,在Web文档选项卡中显示文件名和URL.

如何从C#访问它?

 //the code below just get String like "..../users/favorites/blah.url"
 //call the method with the folder path: 
 //GetFavoriteFiles(Environment.GetFolderPath(Environment.SpecialFolder.Favorites));


private List<String> favFiles = new List<String>();

private void GetFavoriteFiles(String folder)
{
    String[] favs = Directory.GetFiles(folder);
    favFiles.AddRange(favs);
    String[] folders = Directory.GetDirectories(folder);

    if(folders != null)
    {
       foreach(String s in folders)
       {
          GetFavoriteFiles(s);
       }
    }
}
Run Code Online (Sandbox Code Playgroud)

.net c# url favorites internet-explorer

2
推荐指数
2
解决办法
2350
查看次数

如何遵循powershell中的快捷方式

在powershell中,您可以使用cd dir进入目录dir.

但是,如果dir是目录的快捷方式,cd dir并且cd dir.lnk都给出错误,则说该目录不存在.

那么我该如何遵循这条捷径呢?

(在Linux中cd dir 运行.在Windows中,我不知道)

powershell symlink cd shortcut

2
推荐指数
1
解决办法
587
查看次数

桌面上是否存在MS Paint快捷方式?

我想知道桌面上是否存在mspaint快捷方式?如果它存在,用户得分为7,否则为0.我使用此代码:

  string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
  if (Directory.Exist (path + @"\mspaint.exe"))
  {
      Controller.ExamController.AddExam(1, n, 7, time, Session.currentUserId);
  }
  else
  {
      Controller.ExamController.AddExam(1, n, 0, time, Session.currentUserId);
  }
Run Code Online (Sandbox Code Playgroud)

但无论如何结果是"0".但这段代码适用于目录和文件夹并返回7.我也尝试"File.Exist",但它有同样的问题.

如何检查桌面上是否存在特定程序的快捷方式?

    if (questionNumber == 2)
        {


            string path = Environment.GetFolderPath(Environment.SpecialFolder.Desktop);
            var list = Directory.EnumerateFiles(path);
            foreach (var v in list)
            {
                var extension = Path.GetExtension(v);
                if (extension.Equals(".lnk", StringComparison.InvariantCultureIgnoreCase))
                {
                    WshShell shell = new WshShell();
                    IWshShortcut link = (IWshShortcut)shell.CreateShortcut(v);
                    if (Path.GetFileName(link.TargetPath).Equals("mspaint.exe", StringComparison.InvariantCultureIgnoreCase))
                    {
                        Controller.ExamController.AddExam(1, n, 7, time, Session.currentUserId);
                    }
                    else
                    {
                        Controller.ExamController.AddExam(1, n, 0, time, Session.currentUserId); …
Run Code Online (Sandbox Code Playgroud)

c# file

0
推荐指数
1
解决办法
169
查看次数