SHCreateShortcut auf PDA

Antworten
Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

SHCreateShortcut auf PDA

Beitrag von Poelser »

Moin zusammen,

ich möchte gerne, dass meine Anwendung bei Programmstart auf dem PDA automatisch im Startmenü einen Shortcut anlegt. Dazu gibt laut MSDN diese Funktion:

Code: Alles auswählen

SHCreateShortcut
Send Feedback
 
This function creates a shortcut. A remote application interface (RAPI) version of this function exists, CeSHCreateShortcut (RAPI).
Syntax
 
DWORD WINAPI SHCreateShortcut(
  LPTSTR szShortcut,
  LPTSTR szTarget
);
 
Parameters
 
szShortcut
    [in] Null-terminated string that contains the path and name of the shortcut to create. The shortcut is created at the location identified by the path.
szTarget
    [in] Null-terminated string that contains the target path and arguments for the shortcut. The size of the buffer is limited to 256 characters. Place quotes around the target path so that SHCreateShortcut can correctly parse the target file from any following arguments.
 
Return Values
 
TRUE indicates success. FALSE indicates failure. FALSE is also returned if the specified shortcut already exists.
...
Requirements
 
OS Versions: Windows CE 1.0 and later.
Header: Shellapi.h.
Link Library: Coredll.lib.

In der Unit ShellAPI findet man SHCreateShortcut leider nur in Kommentaren, unter den Functions ist nichts. Auch in der aygshell ist nichts (Laz 0.9.27 SVN 20254).

Finde ich das nur nicht weil woanders versteckt, oder geht's tatsächlich nicht? Und wenn's das nicht gibt, wie kann ich das nachbauen?

CU, der Poelser

pluto
Lazarusforum e. V.
Beiträge: 7178
Registriert: So 19. Nov 2006, 12:06
OS, Lazarus, FPC: Linux Mint 19.3
CPU-Target: AMD
Wohnort: Oldenburg(Oldenburg)

Re: SHCreateShortcut auf PDA

Beitrag von pluto »

Schau mal in die unit menus. Sehr weit am ende findest du dort:
ShortCut oder ShortCutToKey..... ich hoffe das ist auch auf einen PDA verfügbar
MFG
Michael Springwald

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: SHCreateShortcut auf PDA

Beitrag von theo »

CeSHCreateShortcut scheint da, aber nicht SHCreateShortcut.
Versuch doch das selber zu importieren. Geht wahrsch. analog CeSHCreateShortcut in rapi.pp nur halt gegen die Version in coredll.inc (KernelDLL).
...nehm ich mal an. ;-)

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: SHCreateShortcut auf PDA

Beitrag von Poelser »

theo hat geschrieben:CeSHCreateShortcut scheint da, aber nicht SHCreateShortcut.
Versuch doch das selber zu importieren. Geht wahrsch. analog CeSHCreateShortcut in rapi.pp nur halt gegen die Version in coredll.inc (KernelDLL).
...nehm ich mal an. ;-)


Das ist für mich ja richtiges Neuland;-)

Also, so wie in der rapi.pp scheint es nicht zu gehen, dort ist das Ziel ja auch win32. Wie ich vom PC aus über ActiveSync einen Shortcut anlege, weiß ich. Für winCE hätte ich jetzt gedacht, ich müsste nur

Code: Alles auswählen

function SHCreateShortcut(_para1: LPTSTR; _para2: LPTSTR):DWORD; external CoreDLL name 'SHCreateShortcut';

in die aygshell einfügen (aygshell.SH + Strg/Space zeigt auch die Verfügbarkeit an), aber dann bekomme ich einen Compilerfehler "Identifier not found".

Benutzeravatar
theo
Beiträge: 10468
Registriert: Mo 11. Sep 2006, 19:01

Re: SHCreateShortcut auf PDA

Beitrag von theo »

Was wird nicht gefunden? CoreDLL? Die StringKonstante kannst du wahrsch durch den String 'coredll' ersetzen.

Ich habe aber kein Ahnung ob das geht. Hab kein WinCE und bin auf Linux. Versuche nur zu helfen :wink:
Das kannst du übrgens auch in deiner eigenen Unit definieren. Muss nicht in eine Systemunit.
Vllt. muss man die Fkt aber auch dynamisch laden. K.A.

Poelser
Beiträge: 55
Registriert: Do 6. Nov 2008, 14:16
OS, Lazarus, FPC: Windows Vista (L 1.0.6 FPC 2.6.0)
CPU-Target: Intel 32 Bit/Arm

Re: SHCreateShortcut auf PDA

Beitrag von Poelser »

theo hat geschrieben:Was wird nicht gefunden? CoreDLL? Die StringKonstante kannst du wahrsch durch den String 'coredll' ersetzen.

Ich habe aber kein Ahnung ob das geht. Hab kein WinCE und bin auf Linux. Versuche nur zu helfen :wink:
Das kannst du übrgens auch in deiner eigenen Unit definieren. Muss nicht in eine Systemunit.
Vllt. muss man die Fkt aber auch dynamisch laden. K.A.


Aber den passenden Hinweis hast du doch gegeben, vielen Dank dafür! Ich habe nun

Code: Alles auswählen

function SHCreateShortcut(_para1: LPTSTR; _para2: LPTSTR):DWORD; external KernelDLL name 'SHCreateShortcut';

in meiner Unit vor Implementation gesetzt, die Aufrufkonvention auf {$calling cdecl}, und den Aufruf mit

Code: Alles auswählen

SHCreateShortcut('\Windows\Bst\MQ-MobilKarte.lnk', PWideChar(Application.ExeName));

gemacht. Funktioniert :)

Einen Wermutstropfen gibt es aber noch: WinCE weigert sich, in \windows\Startmenü und \windows\Startmenü\Programme zu schreiben :x
Damit ist diese Funktion unbrauchbar. Mal sehen, was es denn als Alternativen gibt. Andere Programme könnens ja auch...

Antworten