begin process at 2012 05 24 02:24:45
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Api Windows

 > [COM] CRÉATION DE RACCOURCIS [MASM32]

[COM] CRÉATION DE RACCOURCIS [MASM32]


 Information sur la source

Note :
8 / 10 - par 1 personne
8,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Api Windows Niveau :Initié Date de création :03/12/2002 Date de mise à jour :16/12/2002 21:16:13 Vu / téléchargé :4 282 / 127

Auteur : gblade

Ecrire un message privé
Commentaire sur cette source (8)
Ajouter un commentaire et/ou une note

 Description

une fonction de création de raccourcis voici le prototype C

extern "C" long __stdcall CreateLinkEx(
char * lpLinkPath,
char * lpTargetPath,
char * lpDescription,
char * lpCmdLine,
char * lpIconPath,
unsigned long ulIconIndex);

lpLinkPath : chemin complet ou relatif du raccourci
lpTargetPath : chemin complet du fichier référencé
lpDescription : description (peut être NULL)
lpCmdLine : ligne de commande passée au fichier référencé (peut être NULL)
lpIconPath : chemin complet de l'icone du raccourci
ulIconIndex : index de l'icône (ordre dans lequel une icône est déclarée dans le fichier resource script (.rc)) pour un fichier .ico ulIconPath doit avoir la valeur 0

voila c une chtite fonction tres simple pour montrer l'utilisation (primaire) de COM

un exemple d'utilisation en C (désolé, je n'ai aps le temps d'en réaliser un en ASM et j'ai celui en C sou la main) :

#include <ole2.h>
#include <shlobj.h>
#include <shlwapi.h>

extern "C" void __stdcall CreateLink(char *,char *,char *);
extern "C" void __stdcall CreateLinkEx(char *,char *,char *,char *,char *,int);

extern "C" int __stdcall main(void)
{
char lpDesktopFolder[MAX_PATH];  //définit une chaîne pour accueuillir le chemin du raccourci

CoInitialize(NULL);  //initialise COM

SHGetSpecialFolderPath(NULL,  //récupère le chemin du dossier "Bureau"
  lpDesktopFolder,
  0x10,
  0);
PathAppend(lpDesktopFolder,  //fusionne les deux chemins pour en faire un complet
  "start.lnk");

CreateLinkEx(lpDesktopFolder,                        //crée le raccourci
  "C:\\mes documents\\asm\\MSC\\start.exe",
  "created with CreateLinkEx",
  NULL,
  "C:\\mes documents\\asm\\MSC\\start.ico",
  0);

CoUninitialize();  //finit de travailler avec COM

return 0;
}

bon un exemple en ASM :

.386

assume cs:flat,ds:flat,ss:flat,es:flat,fs:nothing,gs:noth ing


extrn CreateLinkEx@24:proc


data16 segment para public use16

lpLinkPath db "C:\mes documents\asm\MSC\start.lnk",0
lpTargetPath db "C:\mes documents\asm\MSC\start.exe",0
lpDescription db "created with CreateLinkEx",0
lpIconPath db "C:\mes documents\asm\MSC\start.ico",0

data16 ends


code16 segment para public use16

startup:
push 0              ;initialise COM
call CoInitialize

push 0                           ;crée le raccourci
push offset lpIconPath
push 0
push offset lpDescription
push offset lpTargetPath
push offset lpLinkPath
call CreateLinkEx@24

call CoUninitialize  ;finit de travailler avec COM

code16 ends


end startup

Source

  • ;**************************************************************************
  • ; exemple d'utilisation de COM sous MASM32 :
  • ; fonction de création de raccourcis
  • ;
  • ; auteur : gblade
  • ;
  • ; description :
  • ; Ce fichier implémente une fonction de création de raccourcis (fichiers
  • ; link portant l'extention .lnk) via l'architecture COM de Microsoft.
  • ; Les interfaces utilisées sont IShellLink et IPersistFile.
  • ;**************************************************************************
  • .386 ;instructions du 386
  • option language:stdcall ;convention stdcall
  • assume cs:flat,ds:flat,ss:flat,es:flat,fs:flat,gs:flat ;model mémoire win32
  • include kernel32.inc ;header pour les fonctions de gestions de base
  • include ole32.inc ;header pour l'utilisation de COM
  • includelib kernel32.lib ;librairie pour les fonctions de gestions de base
  • includelib ole32.lib ;librairie pour l'utilisation de COM
  • includelib uuid.lib ;identificateurs GUID
  • ;***** Importations *****
  • extrn IID_IPersistFile:dword
  • ;***** Exportations *****
  • public CreateLink@12
  • public CreateLinkEx@24
  • ;***** Constantes *****
  • CLSCTX_INPROC_SERVER equ 01h
  • ;***** Données *****
  • data segment public
  • ;----- Identificateurs -----
  • CLSID_ShellLink dd 00021401h
  • dw 00h,\
  • 00h
  • db 0C0h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 46h
  • IID_IShellLink dd 000214EEh
  • dw 00h,\
  • 00h
  • db 0C0h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 00h,\
  • 46h
  • data ends
  • ;***** Code *****
  • text segment public
  • CreateLinkEx@24:
  • push 18h ;empile le nombre d'octets à dépiler en fin de fonction
  • jmp @f
  • CreateLink@12:
  • push 0ch ;empile le nombre d'octets à dépiler en fin de fonction
  • @@:
  • push ebp ;réserve la pile
  • mov ebp,esp
  • sub esp,10h ;réserve 8 octets de variables locales
  • push ebx ;sauve EBX pour utilisation future
  • lea eax,dword ptr [ebp-04h] ;crée une instance de l'objet IShellLink
  • push eax
  • push offset IID_IShellLink
  • push CLSCTX_INPROC_SERVER
  • push 0
  • push offset CLSID_ShellLink
  • call CoCreateInstance
  • test eax,eax
  • jnz createlink_end
  • mov ebx,dword ptr [ebp-04h] ;charge l'objet IShellLink en EBX
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • push dword ptr [ebp+10h] ;change le chemin du fichier référencé
  • push ebx
  • call dword ptr [ecx+50h]
  • push dword ptr 0208h ;8 octets demandés
  • push 0 ;mémoire fixe demandée
  • call LocalAlloc
  • test eax,eax
  • jz createlink_release_ishelllink
  • mov dword ptr [ebp-0ch],eax ;charge la chaîne nouvellement obtenue dans une variable locale
  • lea eax,dword ptr [ebp-10h] ;récupère le chemin complet et le nom du fichier référencé
  • push eax
  • push [ebp-0ch]
  • push 0208h
  • push dword ptr [ebp+10h]
  • call GetFullPathName
  • mov ecx,dword ptr [ebp-10h] ;charge le nom du fichier en ECX
  • mov byte ptr [ecx-01h],0 ;retranche du chemin complet le nom du fichier
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • push dword ptr [ebp-0ch] ;change le dossier d'exécution du fichier référencé
  • push ebx
  • call dword ptr [ecx+24h]
  • test eax,eax
  • jnz createlink_release_ipersistfile
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • push dword ptr [ebp+14h] ;change la description du raccourci
  • push ebx
  • call dword ptr [ecx+1ch]
  • test eax,eax
  • jnz createlink_release_ipersistfile
  • cmp dword ptr [ebp+04h],18h
  • jnz @f
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • push dword ptr [ebp+18h] ;change les arguments passés au fichier référencé
  • push ebx
  • call dword ptr [ecx+2ch]
  • test eax,eax
  • jnz createlink_release_ipersistfile
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • push dword ptr [ebp+20h] ;change l'icône du raccourci
  • push dword ptr [ebp+1ch]
  • push ebx
  • call dword ptr [ecx+44h]
  • test eax,eax
  • jnz createlink_release_ipersistfile
  • @@:
  • test eax,eax
  • jnz createlink_end
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • lea eax,dword ptr [ebp-08h] ;récupère une instance de l'objet IPersistFile
  • push eax
  • push offset IID_IPersistFile
  • push ebx
  • call dword ptr [ecx]
  • cmp eax,80004002h
  • jz createlink_release_ishelllink
  • push 0208h ;convertit la chaîne au format Unicode
  • push dword ptr [ebp-0ch]
  • push -1
  • push dword ptr [ebp+0ch]
  • push 0
  • push 0
  • call MultiByteToWideChar
  • test eax,eax
  • jz createlink_free
  • mov ebx,[ebp-08h] ;charge l'objet IPersistFile en EBX
  • mov ecx,[ebx] ;charge la VMT de l'objet IPersistFile en ECX
  • push 0 ;sauvegarde le fichier
  • push dword ptr [ebp-0ch]
  • push dword ptr [ebp-08h]
  • call dword ptr [ecx+18h]
  • createlink_free:
  • push dword ptr [ebp-0ch] ;libère la mémoire allouée à la chaîne Unicode
  • call LocalFree
  • createlink_release_ipersistfile:
  • mov ecx,[ebx] ;charge la VMT de l'objet IPersistFile en ECX
  • push ebx ;libère la mémoire allouée à l'objet IPersistFile
  • call dword ptr [ecx+08h]
  • createlink_release_ishelllink:
  • mov ebx,dword ptr [ebp-04h] ;charge l'objet IShellLink en EBX
  • mov ecx,dword ptr [ebx] ;charge la VMT de l'objet IShellLink en ECX
  • push ebx ;libère la mémoire allouée à l'objet IShellLink
  • call dword ptr [ecx+08h]
  • createlink_end:
  • pop ebx ;restaure EBX
  • mov esp,ebp ;enlève les variables locales
  • pop ebp ;restaure EBP
  • pop edx ;enlève les arguments passés à la fonction de la pile
  • pop ecx
  • add esp,edx
  • push ecx
  • ret
  • text ends
  • end
;**************************************************************************
; exemple d'utilisation de COM sous MASM32 :
;   fonction de création de raccourcis
;
; auteur : gblade
;
; description :
;  Ce fichier implémente une fonction de création de raccourcis (fichiers
;  link portant l'extention .lnk) via l'architecture COM de Microsoft.
;  Les interfaces utilisées sont IShellLink et IPersistFile.
;**************************************************************************


.386		;instructions du 386

option language:stdcall		;convention stdcall

assume cs:flat,ds:flat,ss:flat,es:flat,fs:flat,gs:flat		;model mémoire win32

include kernel32.inc		;header pour les fonctions de gestions de base
include ole32.inc		;header pour l'utilisation de COM
includelib kernel32.lib		;librairie pour les fonctions de gestions de base
includelib ole32.lib		;librairie pour l'utilisation de COM
includelib uuid.lib		;identificateurs GUID

;***** Importations *****

extrn IID_IPersistFile:dword


;***** Exportations *****

public CreateLink@12
public CreateLinkEx@24


;***** Constantes *****

CLSCTX_INPROC_SERVER equ 01h


;***** Données *****

data segment public

;----- Identificateurs -----
CLSID_ShellLink dd 00021401h
dw 00h,\
  00h
db 0C0h,\
  00h,\
  00h,\
  00h,\
  00h,\
  00h,\
  00h,\
  46h

IID_IShellLink dd 000214EEh
dw 00h,\
  00h
db 0C0h,\
  00h,\
  00h,\
  00h,\
  00h,\
  00h,\
  00h,\
  46h

data ends


;***** Code *****

text segment public

CreateLinkEx@24:
	push 18h		;empile le nombre d'octets à dépiler en fin de fonction
	jmp @f

CreateLink@12:
	push 0ch		;empile le nombre d'octets à dépiler en fin de fonction
	@@:
	push ebp		;réserve la pile
	mov ebp,esp
	sub esp,10h		;réserve 8 octets de variables locales
	push ebx		;sauve EBX pour utilisation future

	lea eax,dword ptr [ebp-04h]		;crée une instance de l'objet IShellLink
	push eax
	push offset IID_IShellLink
	push CLSCTX_INPROC_SERVER
	push 0
	push offset CLSID_ShellLink
	call CoCreateInstance

	test eax,eax
	jnz createlink_end

	mov ebx,dword ptr [ebp-04h]		;charge l'objet IShellLink en EBX
	mov ecx,dword ptr [ebx]			;charge la VMT de l'objet IShellLink en ECX

	push dword ptr [ebp+10h]		;change le chemin du fichier référencé
	push ebx
	call dword ptr [ecx+50h]

	push dword ptr 0208h		;8 octets demandés
	push 0				;mémoire fixe demandée
	call LocalAlloc

	test eax,eax
	jz createlink_release_ishelllink

	mov dword ptr [ebp-0ch],eax		;charge la chaîne nouvellement obtenue dans une variable locale

	lea eax,dword ptr [ebp-10h]		;récupère le chemin complet et le nom du fichier référencé
	push eax
	push [ebp-0ch]
	push 0208h
	push dword ptr [ebp+10h]
	call GetFullPathName

	mov ecx,dword ptr [ebp-10h]		;charge le nom du fichier en ECX
	mov byte ptr [ecx-01h],0		;retranche du chemin complet le nom du fichier

	mov ecx,dword ptr [ebx]			;charge la VMT de l'objet IShellLink en ECX

	push dword ptr [ebp-0ch]		;change le dossier d'exécution du fichier référencé
	push ebx
	call dword ptr [ecx+24h]

	test eax,eax
	jnz createlink_release_ipersistfile

	mov ecx,dword ptr [ebx]			;charge la VMT de l'objet IShellLink en ECX

	push dword ptr [ebp+14h]		;change la description du raccourci
	push ebx
	call dword ptr [ecx+1ch]

	test eax,eax
	jnz createlink_release_ipersistfile

	cmp dword ptr [ebp+04h],18h
	jnz @f

	mov ecx,dword ptr [ebx]			;charge la VMT de l'objet IShellLink en ECX

	push dword ptr [ebp+18h]		;change les arguments passés au fichier référencé
	push ebx
	call dword ptr [ecx+2ch]

	test eax,eax
	jnz createlink_release_ipersistfile

	mov ecx,dword ptr [ebx]			;charge la VMT de l'objet IShellLink en ECX

	push dword ptr [ebp+20h]		;change l'icône du raccourci
	push dword ptr [ebp+1ch]
	push ebx
	call dword ptr [ecx+44h]

	test eax,eax
	jnz createlink_release_ipersistfile

	@@:
	test eax,eax
	jnz createlink_end

	mov ecx,dword ptr [ebx]		;charge la VMT de l'objet IShellLink en ECX

	lea eax,dword ptr [ebp-08h]		;récupère une instance de l'objet IPersistFile
	push eax
	push offset IID_IPersistFile
	push ebx
	call dword ptr [ecx]

	cmp eax,80004002h
	jz createlink_release_ishelllink

	push 0208h				;convertit la chaîne au format Unicode
	push dword ptr [ebp-0ch]
	push -1
	push dword ptr [ebp+0ch]
	push 0
	push 0
	call MultiByteToWideChar

	test eax,eax
	jz createlink_free

	mov ebx,[ebp-08h]		;charge l'objet IPersistFile en EBX
	mov ecx,[ebx]			;charge la VMT de l'objet IPersistFile en ECX

	push 0					;sauvegarde le fichier
	push dword ptr [ebp-0ch]
	push dword ptr [ebp-08h]
	call dword ptr [ecx+18h]

	createlink_free:
	push dword ptr [ebp-0ch]		;libère la mémoire allouée à la chaîne Unicode
	call LocalFree

	createlink_release_ipersistfile:
	mov ecx,[ebx]		;charge la VMT de l'objet IPersistFile en ECX

	push ebx				;libère la mémoire allouée à l'objet IPersistFile
	call dword ptr [ecx+08h]

	createlink_release_ishelllink:
	mov ebx,dword ptr [ebp-04h]		;charge l'objet IShellLink en EBX
	mov ecx,dword ptr [ebx]			;charge la VMT de l'objet IShellLink en ECX

	push ebx				;libère la mémoire allouée à l'objet IShellLink
	call dword ptr [ecx+08h]

	createlink_end:
	pop ebx			;restaure EBX
	mov esp,ebp		;enlève les variables locales
	pop ebp			;restaure EBP

	pop edx			;enlève les arguments passés à la fonction de la pile
	pop ecx
	add esp,edx
	push ecx

	ret

text ends


end   

 Conclusion

bug éventuel du a l'utilisation des icones (ce n'est aps de moi mais des fois windows va refuser de prendre en compte une icone alors que la fonction reussi sans erreur)

je rappelle juste qu'en raison de la nature de la fonction, le programme doit faire un appel a CoInitialize et CoUninitialize avant et apres la fonction  

 Fichier Zip

Les Membres Club peuvent télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !
  • lnk.objTélécharger ce fichier [Réservé aux membres club]1 134 octets
  • lnk03.asmTélécharger ce fichier [Réservé aux membres club]Voir ce fichier5 546 octets

Télécharger le zip


 Sources du même auteur

Source avec Zip [COM] CRÉATION D'UN OBJET VIDE (QUI NE FAIT RIEN) [MASM,32BI...
PASSER EN MODE PROTÉGÉ [MASM]

 Sources de la même categorie

Source avec Zip Source avec une capture BODY_ROTATION BASÉ SUR LE TRAVAIL DE TOM par jose2pepe
Source avec Zip Source avec une capture FROM TOM'S CUBE_ROTATION AND CUBE_5 CUBE COLOR RENDERIZED par jose2pepe
Source avec Zip REUTILISER N'IMPORTE QUEL PROGRAMME EX:WORDPAD par ToutEnMasm
Source avec Zip CRÉER DES TABLEAUX DE DONNÉES DE MANIÈRE DYNAMIQUE par ToutEnMasm
Source avec Zip AFFICHAGE DATE ET HEURE AVEC DES BITMAPS par jejamar

Commentaires et avis

Commentaire de Cendra le 07/12/2002 19:23:35

je pense qu'il serai bien d'ajouter un exemple d'utilisation de ta fonction :)
ca permetrai aux plus faibles de s'en servir ;)

Commentaire de Cendra le 15/12/2002 22:18:17

merci pour l'exemple en C, mais j'attendrai la version en asm ;)
je comprend pas grand chose au C :D
( si possible avant le 22/12 stp :p )

Commentaire de gblade le 16/12/2002 20:58:28

euh... je croyais que tlm connaissait le C ;p non je blague, v voir ce que je peux faire mais tu veux l'exemple pour toi ??

Commentaire de gblade le 17/12/2002 10:32:05

ca y est, g mis a jour l'exemple, maintenant ya tjrs celui en C accompagné d'un en ASM

Commentaire de Cendra le 17/12/2002 20:35:15

merci beaucoup :)

Commentaire de Cendra le 22/12/2002 17:03:48

j'arrive pas a ajouter le choix du repertoire de demarrage; quelqu'un  serai le faire ? ... j'y comprend pas grand chose a cette fonction en plus (meme avec les commentaires ) :p

Commentaire de gblade le 22/12/2002 19:43:56

arf, le choix est automatique en fonction du nom du fichier cible, pour changer ca faudrait faudrait :
- ajouter un parametre
- enlever la partie de code qui détermine le repertoire d'execution
- charger le nouveau parametre en argument de la fonction qui modifie le repertoire de lancement

mov ecx,dword ptr [ebx]         ;charge la VMT de l'objet IShellLink en ECX

    push dword ptr [ebp+24h]        ;change le dossier d'exécution du fichier référencé
    push ebx
    call dword ptr [ecx+24h]

Commentaire de ToutEnMasm le 07/02/2004 14:57:46

Dire que MASM32 fournit un exemple tout fait et même pas buggé me laisse pantois devant une telle syntaxe ne connaissant pas invoke.L'exemple se trouve dans le répertoire masm32\com il faut juste prendre la peine d'extraire les fichiers du zip.
                      ToutEnMasm

 Ajouter un commentaire




Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 2,200 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales