AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi Problem beim Verknüpfung erstellen
Thema durchsuchen
Ansicht
Themen-Optionen

Problem beim Verknüpfung erstellen

Offene Frage von "Sir K"
Ein Thema von Sir K · begonnen am 30. Jan 2009 · letzter Beitrag vom 4. Jul 2009
Antwort Antwort
Seite 2 von 3     12 3      
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#11

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:06
Delphi-Quellcode:
 
psl.SetPath(PChar(AFilename));
psl.SetDescription(PChar(ADescription));
psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename)) ;);
Pchar liefert einen Pointer auf ein UniCode String zurück.
Was psl.SetPath erwartet weiß ich nicht, vielleicht einen Pointer auf einen AnsiString.
Ich würde mal in diese Richtung suchen.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#12

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:06
Mal zum Testen alles explizit auf ANSI umgestellt. Funktioniert es so?
Delphi-Quellcode:
function CreateLink(const AFilename, ALNKFilename, ADescription: Ansistring) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PAnsiChar(AFilename));
    psl.SetDescription(PAnsiChar(ADescription));
    psl.SetWorkingDirectory(PAnsiChar(ExtractFilePath(AFilename)) ;);
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PAnsiChar(ALNKFilename), -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Sir K

Registriert seit: 30. Nov 2008
75 Beiträge
 
RAD-Studio 2009 Arc
 
#13

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:15
Zitat von DeddyH:
Mal zum Testen alles explizit auf ANSI umgestellt. Funktioniert es so?
Delphi-Quellcode:
function CreateLink(const AFilename, ALNKFilename, ADescription: Ansistring) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PAnsiChar(AFilename));
    psl.SetDescription(PAnsiChar(ADescription));
    psl.SetWorkingDirectory(PAnsiChar(ExtractFilePath(AFilename)) ;);
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PAnsiChar(ALNKFilename), -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;
nein das gibts in den zeilen die meldung ink. dat. AnsiChar und Char
Delphi-Quellcode:
psl.SetPath(PAnsiChar(AFilename));
    psl.SetDescription(PAnsiChar(ADescription));
    psl.SetWorkingDirectory(PAnsiChar(ExtractFilePath(AFilename)));
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#14

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:20
Dann muss ich mich leider ausklinken, da ich kein Delphi 2009 habe und nur noch herumraten könnte.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Sir K

Registriert seit: 30. Nov 2008
75 Beiträge
 
RAD-Studio 2009 Arc
 
#15

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:24
trotzdem danke für die bisherige Hilfe xD

Gruß
Sir K
  Mit Zitat antworten Zitat
BullsEye

Registriert seit: 8. Sep 2007
Ort: Werlte
872 Beiträge
 
Delphi 7 Personal
 
#16

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:45
Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    OpenDialog1: TOpenDialog;
    Button2: TButton;
    Label1: TLabel;
    Label2: TLabel;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation
USES SHLOBJ, ACTIVEX;
{$R *.dfm}

// Der Einfachheit halber heisst der Link genauso, wie die Datei
function CreateDesktopLink(const p_sFilePath : string;const p_sDesktopDir : string) : Boolean;

const // Fehlende Deklaration in Delphi
  // Zu finden in der Registry
  // HKEY_CLASSES_ROOT\Interface
  // nach IPersistFile suchen
  IID_IPersistFile: TGUID = '{0000010b-0000-0000-C000-000000000046}';

var
  slShellLink : IShellLink; // ShellLink Interface
  pfPersistFile : IPersistFile; // Shortcut (Link) Permanent speichern
  wszShortCut : PWideChar; // Buffer für den Shortcutnamen
  hRes : HResult; // Für Zwischenergebnisse
  sShortCut : string; // So heisst dann der Shortcut
  dwLen : DWORD;

begin
  Result := false;
  // COM Object der Klasse ShellLink erzeugen
  hRes := CoCreateInstance(CLSID_ShellLink, // ID von ShellLink (Typ TGUID)
                           nil,
                           CLSCTX_INPROC_SERVER,
                           IID_IShellLinkA, // Referenz auf die Funktion
                           slShellLink); // Pointer auf IShellLink Interface
  if hRes <> S_OK then
  begin
    exit;
  end;
  slShellLink.SetPath(PChar(p_sFilePath)); // Auf diese Datei geht der Link
  hRes := slShellLink.QueryInterface(IID_IPersistFile,pfPersistFile); // Pointer auf IPersist holen
  if hRes <> S_OK then
  begin
    exit;
  end;
  dwLen := (MAX_PATH+1)*2;
  wszShortcut := AllocMem(dwLen);
  try
    sShortCut := ChangeFileExt(p_sFilePath,'.LNK');
    sShortCut := p_sDesktopDir + '\' + ExtractFileName(sShortCut);
    StringToWideChar(sShortCut,wszShortCut,dwLen);
    hRes := pfPersistFile.Save(wszShortCut, TRUE); // Jetzt noch den Link speichern
  finally
    FreeMem(wszShortCut,dwLen); // und den Platz wieder freigeben
  end;
  Result := (hRes = S_OK);
end;



procedure TForm1.Button1Click(Sender: TObject);
var
  szDesktopFolder : PChar;

begin
  if Opendialog1.Execute then
  begin
    szDesktopFolder := StrAlloc(MAX_PATH+1);
    try
      if not SHGetSpecialFolderPath(self.Handle,szDesktopFolder,CSIDL_COMMON_DESKTOPDIRECTORY,false) then
      begin
        ShowMessage(SysErrorMessage(GetLastError));
        exit;
      end;
      if not CreateDesktopLink(OpenDialog1.FileName,szDesktopFolder) then
      begin
        ShowMessage(SysErrorMessage(GetLastError));
      end;
    finally
      StrDispose(szDesktopFolder);
    end;
  end;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
Close;
end;

initialization
begin
  CoInitialize(nil);
end;

finalization
begin
  CoUninitialize;
end;

end.
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.755 Beiträge
 
Delphi 10.4 Sydney
 
#17

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 11:50
Laut msdn kann IShellLink Ansi und UniCode.

Delphi-Quellcode:
function CreateLink(const AFilename, ALNKFilename, ADescription: string) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PWideChar(AFilename));
    psl.SetDescription(PWideChar(ADescription));
    psl.SetWorkingDirectory(PWideChar(ExtractFilePath(AFilename)) ;);
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      ppf.Save(PWideChar(ALNKFileName, true);
      // das result := true sollte noch irgendwo untergebracht werden.
    end;
  end;
end;
Weil, mkinzler hatte mal in einem Thread geschrieben:
Delphi2009 String = UniCode <> WideString

Dies ist auch mein letzter Versuch, ich habe auch kein Delphi2009 zur Verfügung.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Sir K

Registriert seit: 30. Nov 2008
75 Beiträge
 
RAD-Studio 2009 Arc
 
#18

Re: Problem beim Verknüpfung erstellen

  Alt 30. Jan 2009, 12:06
geht leider auch nicht
trotzdem Danke xD

Gruß
Sir K
  Mit Zitat antworten Zitat
Micha88
(Gast)

n/a Beiträge
 
#19

Re: Problem beim Verknüpfung erstellen

  Alt 26. Feb 2009, 11:37
Folgende Funktion funktioniert unter RAD 2009 einwandfrei, benutze ich selber:

Delphi-Quellcode:
function CreateLink(const AFilename, ALNKFilename,
ADescription: AnsiString) : Boolean;
var
  psl : IShellLink;
  ppf : IPersistFile;
  wsz : PWideChar;
begin
  result:=false;
  if SUCCEEDED(CoCreateInstance(CLSID_ShellLink, nil,
  CLSCTX_inPROC_SERVER, IID_IShellLinkA, psl)) then
  begin
    psl.SetPath(PChar(AFilename));
    psl.SetDescription(PChar(ADescription));
    psl.SetWorkingDirectory(PChar(ExtractFilePath(AFilename)));
    if SUCCEEDED(psl.QueryInterface(IPersistFile, ppf)) then
    begin
      GetMem(wsz, MAX_PATH*2);
      try
        MultiByteToWideChar(CP_ACP, 0, PAnsiChar(ALNKFilename),
        -1, wsz, MAX_PATH);
        ppf.Save(wsz, true);
        result:=true;
      finally
        FreeMem(wsz, MAX_PATH*2);
      end;
    end;
  end;
end;
Aufruf:
Delphi-Quellcode:
 CreateLink('C:\TEST.exe', // Ziel
 vDesktopPfad + '\' + 'TEST.lnk', // Speicherort der verknüpfung
 'Das ist eine Testbeschreibung zu TEST.exe'); // Verknüpfungs Beschreibung
  Mit Zitat antworten Zitat
BlueStarHH

Registriert seit: 28. Mär 2005
Ort: Hannover-Hainholz
801 Beiträge
 
Delphi 11 Alexandria
 
#20

Re: Problem beim Verknüpfung erstellen

  Alt 4. Jul 2009, 11:41
Die Lösung aus Betrag #19 funktioniert zwar, ist aber nicht Unicode fähig. Die Lösung aus Beitrag #17 ist Unicode fähig. Damit diese funktioniert, muss IID_IShellLinkA durch IID_IShellLinkW ersetzt werden.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 3     12 3      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:04 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz