2012-04-25 6 views
1

J'ai un programme de formulaire de fenêtre très simple et je veux démarrer notepad.exe quand j'appuie sur un bouton. Je reçois des erreurs attendues. S'il vous plaît aider.Comment démarrer correctement un processus dans VC++?

Au début de mon code, je

#pragma once 
#include <windows.h> 
#include <Shellapi.h> 

Dans le gestionnaire d'événements, je

private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { 


       //memset(&ExecuteInfo, 0, sizeof(ExecuteInfo)); 

       ExecuteInfo.cbSize  = sizeof(ExecuteInfo); 
       ExecuteInfo.fMask  = NULL;    
       ExecuteInfo.hwnd   = NULL;    
       ExecuteInfo.lpVerb  = "open";      // Operation to perform 
       ExecuteInfo.lpFile  = "C:\\Windows\\notepad.exe"; // Application name 
       ExecuteInfo.lpParameters = NULL;   // Additional parameters 
       ExecuteInfo.lpDirectory = NULL;       // Default directory 
       ExecuteInfo.nShow  = SW_SHOW; 
       ExecuteInfo.hInstApp  = NULL; 

       ShellExecuteEx(&ExecuteInfo); 

     } 

Note: Je reçois le texte suivant le message d'erreur si je me mis à « Utiliser Unicode Jeu de caractères » dans les pages de propriétés> Propriétés de configuration> général (ALT-F7)

1>c:\users\marco\desktop\new folder (2)\test000\test000\Form1.h(140): error C2440: '=' : cannot convert from 'const char [5]' to 'LPCWSTR' 
1>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 
1>c:\users\marco\desktop\new folder (2)\test000\test000\Form1.h(141): error C2440: '=' : cannot convert from 'const char [23]' to 'LPCWSTR' 
1>   Types pointed to are unrelated; conversion requires reinterpret_cast, C-style cast or function-style cast 

note: je reçois le fo llowing le message d'erreur si je réglé sur « Utiliser multi-octets Jeu de caractères » dans les pages de propriétés> Propriétés de configuration> Général (ALT-F7)

1>test000.obj : error LNK2028: unresolved token (0A000012) "extern "C" int __stdcall ShellExecuteExA(struct _SHELLEXECUTEINFOA *)" ([email protected]@[email protected]@@Z) referenced in function "private: void __clrcall test000::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z) 
1>test000.obj : error LNK2019: unresolved external symbol "extern "C" int __stdcall ShellExecuteExA(struct _SHELLEXECUTEINFOA *)" ([email protected]@[email protected]@@Z) referenced in function "private: void __clrcall test000::Form1::button1_Click(class System::Object ^,class System::EventArgs ^)" ([email protected]@[email protected]@[email protected]@@[email protected]@@Z) 
1>C:\Users\Marco\Desktop\New folder (2)\test000\Debug\test000.exe : fatal error LNK1120: 2 unresolved externals 

Répondre

1

Une autre solution: Si vous utilisez C++/CLI, vous pouvez tout aussi bien utiliser la méthode a réussi à lancer un processus:

System::Diagnostics::Process::Start("C:\\Windows\\notepad.exe"); 

Cela devrait également éviter les problèmes de jeu de caractères.
Ce qui ne signifie pas que vous devriez les ignorer car il est bon de savoir sur le problème sous-jacent. Roee Shenberg a abordé cela dans sa réponse.

+0

Cela fonctionne.Merci – user765168

+1

J'aime tellement ça.Je peux ouvrir Firefox et aller à un site web avec seulement 1 ligne de code. – user765168

1

Vous devez utiliser le texte() macro autour de vos chaînes (par exemple TEXT ("open") au lieu de "open") ou convertissez vos chaînes ANSI en UTF-16 lors de l'exécution (par exemple, en utilisant la fonction mbstowcs_s()). La raison pour laquelle cela se produit est que TCHAR est un type de char Microsoft qui est soit char soit wchar_t selon que le projet est configuré pour unicode ou non. Notez que le type de lpFile et d'amis est LPCTCHAR (pointeur long vers const TCHAR), ce qui signifie que si vous utilisez la configuration unicode (par défaut), elle devient un const wchar_t *, et un char [] ne peut pas être implicitement jeté à elle.

+0

Merci pour votre réponse. J'ai suivi ce que vous avez dit de changer le "ouvert" à TEXT ("ouvert"), a également changé la chaîne de bloc-notes à TEXT ("c: \\ windows \\ notepad.exe"). J'ai de nouveau visité la page de propriétés et ** j'ai retrouvé l'option "Utiliser le jeu de caractères Unicode" **. Après cela, j'ai essayé de reconstruire mon programme, mais VS m'a montré le 1> test000.obj: erreur LNK2028: jeton non résolu (0A000012) "extern" C "int __stdcall ShellExecuteExA (structure _SHELLEXECUTEINFOA *)" (? ShellExecuteExA ..... ........ ** (La même erreur que le paramètre "Utiliser le jeu de caractères multi-octets") ** Toute suggestion? – user765168

Questions connexes