Nic*_*zee 10 .net c# windows shortcut windows-server-2008
我正在尝试在我的Windows文件系统上创建一个快捷方式(.lnk).我的代码工作正常.但是,当我在Windows 2008R2服务器上运行相同的控制台应用程序时,它的行为方式不同.
所以我有我的控制台应用程序,接下来会发生什么:
我的程序只是在桌面上创建了一个带有.docx扩展名的快捷方式,并且在我的本地计算机上一切正常.当我在我的服务器上运行相同的控制台应用程序时,它会创建相同的快捷方式,但目标已被修改 ...它将目标更改为.doc文件.
换句话说,当我运行控制台应用程序时:
LOCALMACHINE
创建指向U:\ test.docx的 MyWordFile.lnk
服务器
创建指向U:\ test.doc的 MyWordFile.lnk
这是一种奇怪的行为.这是
代码
using System;
using System.IO;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Text;
namespace TestShortcut
{
class Program
{
static void Main(string[] args)
{
//ShortcutTarget
var sTarget = @"U:\test.docx";
//ShortCutName
var sName = @"MyWordFile.lnk";
IShellLink link = (IShellLink)new ShellLink();
link.SetPath(sTarget);
IPersistFile file = (IPersistFile)link;
string desktopPath = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory);
file.Save(Path.Combine(desktopPath, sName), false);
}
}
[ComImport]
[Guid("00021401-0000-0000-C000-000000000046")]
internal class ShellLink
{
}
[ComImport]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
[Guid("000214F9-0000-0000-C000-000000000046")]
internal interface IShellLink
{
void GetPath([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszFile, int cchMaxPath, out IntPtr pfd, int fFlags);
void GetIDList(out IntPtr ppidl);
void SetIDList(IntPtr pidl);
void GetDescription([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszName, int cchMaxName);
void SetDescription([MarshalAs(UnmanagedType.LPWStr)] string pszName);
void GetWorkingDirectory([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszDir, int cchMaxPath);
void SetWorkingDirectory([MarshalAs(UnmanagedType.LPWStr)] string pszDir);
void GetArguments([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszArgs, int cchMaxPath);
void SetArguments([MarshalAs(UnmanagedType.LPWStr)] string pszArgs);
void GetHotkey(out short pwHotkey);
void SetHotkey(short wHotkey);
void GetShowCmd(out int piShowCmd);
void SetShowCmd(int iShowCmd);
void GetIconLocation([Out, MarshalAs(UnmanagedType.LPWStr)] StringBuilder pszIconPath, int cchIconPath, out int piIcon);
void SetIconLocation([MarshalAs(UnmanagedType.LPWStr)] string pszIconPath, int iIcon);
void SetRelativePath([MarshalAs(UnmanagedType.LPWStr)] string pszPathRel, int dwReserved);
void Resolve(IntPtr hwnd, int fFlags);
void SetPath([MarshalAs(UnmanagedType.LPWStr)] string pszFile);
}
}
Run Code Online (Sandbox Code Playgroud)
更新
我注意到第4个字符从目标的扩展名中删除了.所以,当我有一个文件"file.abcdef"时,链接指向"file.abc".另外的空间会被替换为下划线,所以"我file.abcd"指针变成"my_file.abc"
创建快捷方式不会修改目标的名称.
你看到别的东西,"my_file.abc"是"my file.abcd" 的简称.此类名称始终在仍具有短名称生成功能的文件系统上创建.几乎所有人都做了,尽管今天已经很少需要了.保持"my file.abcd"与只能处理MS-Dos名称的程序兼容,需要更换空间并将扩展名缩短为3个字母.您还经常在这些名称中看到"~1",用于将文件名截断为8个字母.
您可以看到短名称DIR /x.
究竟如何从这个问题中看出这个文件的短名称并不明显.但是IShellLink接口声明肯定是错误的,方法没有按正确的顺序列出.这对于ComInterfaceType.InterfaceIsIUnknown接口有相当严重的后果,您将在运行时调用错误的方法.Path属性设置器实际上是第二种方法.你现在正在调用第18种方法,并不是很难猜出它可能会做什么.好吧,如果它没有抛出异常,这是非常令人惊讶的,这符合条件:)这并非完全令人难以置信的btw,添加的第17个方法是Target属性的getter ,在接口的更高版本中添加.您可能会意外地击中未记录的二传手.故意无证.
只是不要自己声明界面.最好的方法是使用Project> Add Reference> Browse按钮>选择C:\ Windows\System32\Shell32.dll.在这篇文章中有更详细的描述.
| 归档时间: |
|
| 查看次数: |
424 次 |
| 最近记录: |