是否可以在电子邮件正文中制作一个 link 来启动我安装在本地计算机上的 Delphi 应用程序?

Is it possible in the body of an email to make a link that will launch my Delphi app installed in the local computer?

我正在寻找一种方法来改进不同工具之间的导航(在 windows 下)。我想在电子邮件正文中添加一个特殊的“link”,当用户单击它时将启动我安装在他本地计算机上的 delphi 应用程序。可以吗?如果可以怎么办?

是的,这是可能的。您的应用程序必须创建一个名字对象(例如,从其设置或首次启动)。这将允许邮件客户端打开指向您的应用程序的 URL,Windows 将启动它并将 URL 传递给它。

这是 register/unregister URL 协议的一些源代码:

function RegisterURLProtocol(
  const ProtocolID   : String;
  const ProtocolName : String;
  const DefaultIcon  : String;
  const OpenCommand  : String) : Boolean;
var
  Reg : TRegistry;
begin
  Result := FALSE;
  Reg    := TRegistry.Create(KEY_WRITE);
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.OpenKey(ProtocolID, TRUE) then
      Exit;
    
    Reg.WriteString('', 'URL:' + ProtocolName);
    Reg.WriteString('URL Protocol', '');
    
    if Reg.OpenKey('DefaultIcon', True) then begin
      Reg.WriteString('', DefaultIcon);
    end;
    Reg.CloseKey;
    
    if not Reg.OpenKey(ProtocolID + '\shell\open\command', True) then
      Exit;
    
    Reg.WriteString('', OpenCommand);
    Result := TRUE;
  finally
    FreeAndNil(Reg);
  end;
end;
    
function UnregisterURLProtocol(
  const ProtocolID : String) : Boolean;
var
  Reg           : TRegistry;
begin
  Result := FALSE;
  Reg := TRegistry.Create(KEY_WRITE);
  try
    Reg.RootKey := HKEY_CLASSES_ROOT;
    if not Reg.KeyExists(ProtocolID) then
      Exit;
    Reg.DeleteKey(ProtocolID + '\DefaultIcon');
    Reg.DeleteKey(ProtocolID + '\shell\open\command');
    Reg.DeleteKey(ProtocolID + '\shell\open');
    Reg.DeleteKey(ProtocolID + '\shell');
    Reg.DeleteKey(ProtocolID);
    Result := TRUE;
  finally
    FreeAndNil(Reg);
  end;
end;

ProtocolID 是您的协议的标识符。您可以使用 'MyApp' 之类的东西。如果您必须注册 HTTP 协议,您将使用“http'”。当用户单击 link 时,应用程序将由 Windows 打开。应用程序将接收 OpenCommand 指定的内容(您指定的字符串)。您可以在该 OpenCommand 中包含 %1,它将被 URL 替换,协议除外。

ProtocolName 是描述您的协议的字符串。

放在邮件中的URL是这样的:

MyApp://SomeParameters/SomeMoreParameters