2010-12-10 8 views
0

comment puis-je lancer par programme une application à partir d'un raccourci Windows (fichier .lnk)?Comment puis-je lancer par programme (C++) une application à partir d'un raccourci Windows (fichier .lnk)?

J'ai essayé d'utiliser l'API ShellExecute et cela semble fonctionner. Toute mise en garde?

Merci.

Ici, il est un extrait de mon code actuel:

#include <windows.h> 

#include <map> 
#include <string> 
#include <iostream> 

int main(int, char**) 
{ 
    std::map< int, std::wstring > errors; 
    errors[0]      = L"The operating system is out of memory or resources."; 
    errors[ERROR_FILE_NOT_FOUND] = L"The specified file was not found."; 
    errors[ERROR_PATH_NOT_FOUND] = L"The specified path was not found."; 
    errors[ERROR_BAD_FORMAT]  = L"The .exe file is invalid (non-Microsoft Win32 .exe or error in .exe image)."; 
    errors[SE_ERR_ACCESSDENIED] = L"The operating system denied access to the specified file."; 
    errors[SE_ERR_ASSOCINCOMPLETE] = L"The file name association is incomplete or invalid."; 
    errors[SE_ERR_DDEBUSY]   = L"The Dynamic Data Exchange (DDE) transaction could not be completed because other DDE transactions were being processed."; 
    errors[SE_ERR_DDEFAIL]   = L"The DDE transaction failed."; 
    errors[SE_ERR_DDETIMEOUT]  = L"The DDE transaction could not be completed because the request timed out."; 
    errors[SE_ERR_DLLNOTFOUND]  = L"The specified DLL was not found."; 
    errors[SE_ERR_FNF]    = L"The specified file was not found."; 
    errors[SE_ERR_NOASSOC]   = L"There is no application associated with the given file name extension. This error will also be returned if you attempt to print a file that is not printable."; 
    errors[SE_ERR_OOM]    = L"There was not enough memory to complete the operation."; 
    errors[SE_ERR_PNF]    = L"The specified path was not found."; 
    errors[SE_ERR_SHARE]   = L"A sharing violation occurred."; 

    int ret = reinterpret_cast<int>(::ShellExecute(0,L"open",L"\"C:\\Documents and Settings\\All Users\\Start Menu\\Programs\\Accessories\\Calculator.lnk\"",0,0,SW_SHOW)); 
    const int minimumRetOK = 33; 
    if (ret < minimumRetOK) { 
     if (errors.count(ret)) { 
     std::wcout << L"Error " << ret << L" " << errors[ ret ]; 
     } else { 
     std::wcout << L"Error " << ret << L" undocumented error"; 
     } 
    } 

    return 0; 
} 

Répondre

1

Je ne suis pas sûr de ce que vous n'êtes pas sûr, le comportement que vous observez est documented. L'opération "open" ShellExecute, fera tout ce que le shell fait quand vous "ouvrez" le fichier référencé par l'argument du fichier (vous pouvez cliquer avec le bouton droit sur un raccourci et sélectionner "Ouvrir" explicitement, mais c'est aussi la valeur par défaut opération pour .lnk, donc c'est la même chose qu'un double-clic). "Ouverture" d'un fichier raccourci, il "ouvrira" la cible, si la cible est un exécutable qu'elle exécutera, s'il s'agit d'un document ou d'un fichier de données, elle s'ouvrira dans le programme associé, ou demandera un programme si aucun n'est associé.

+0

Merci pour votre explication. –

0

ShellExecute ou CreateProcess devrait être en mesure d'ouvrir le fichier de lien. S'ils ne peuvent pas trouver le fichier associé et/ou le programme, vous pouvez toujours utiliser ces API et déléguer le travail dur à "cmd start" ou "explorer". Par exemple. ShellExecute(0, "open", "explorer", linkfile, 0, SW_SHOW);

1

ShellExecute devrait fonctionner.

Mais ...

int main(int, wchar_t*) 

... pas compilateur Je sais que cette signature de soutien. Il suffit d'écrire:

int main() 

En outre, pour les messages Dignostic, il suffit d'utiliser la fonction API FormatMessage Windows ou, si le code est exclusivement pour Visual C++, utilisez la classe de soutien approprié qui est fourni avec ce compilateur.

Vive & HTH.,

+0

Oui, j'ai fait une erreur dans la signature principale. Le compilateur Microsoft me permet de le faire :-) En ce qui concerne FormatMessage, j'en suis conscient mais je pense que dans ce cas cela ne fonctionnera pas car ShellExecute a ses codes d'erreur particuliers. –

+0

@uvts_cvs: bien, je ne trouve aucune DLL de ressource de message pour shell32, donc 'FormatMessage' ne fonctionnerait que pour les trois codes' ERROR_' * xxx *. :-( –

Questions connexes