我有一个.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的线程的调用.请帮忙 :)
可能重复:
获取快捷方式文件夹的目标
例如,在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) 我正在使用.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) 在powershell中,您可以使用cd dir进入目录dir.
但是,如果dir是目录的快捷方式,cd dir并且cd dir.lnk都给出错误,则说该目录不存在.
那么我该如何遵循这条捷径呢?
(在Linux中cd dir 运行.在Windows中,我不知道)
我想知道桌面上是否存在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)