Les APIs Windows sous Dev C++... [Résolu]

Signaler
Messages postés
92
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
16 janvier 2007
-
Messages postés
92
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
16 janvier 2007
-
Bonjour,
j'ai vraiment du mal a trouver un bout de code avec un CreateProcess QUI MARCHE SOUS DEV C++ !
Pouvez vous m'aider svp ?
Jah bless mycode

6 réponses

Messages postés
547
Date d'inscription
mercredi 8 janvier 2003
Statut
Membre
Dernière intervention
7 octobre 2007
1
Bonjour,


Ce code est certe un peu crade (j'ai fait ça vite fait pour vérifier que ça marche)

/* DEBUT ***************************************/

#include <windows.h>


#define CMD_NOTEPAD 1000


/*  Declare Windows procedure  */

LRESULT CALLBACK WindowProcedure (HWND, UINT, WPARAM, LPARAM);


/*  Make the class name into a global variable  */

char szClassName[ ] = "WindowsApp";


int WINAPI WinMain (HINSTANCE hThisInstance, HINSTANCE hPrevInstance,

                   
LPSTR lpszArgument, int nFunsterStil)


{

   HWND
hwnd;              
/* This is the handle for our window */

   MSG
messages;           
/* Here messages to the application are saved */

   WNDCLASSEX wincl;        /* Data structure for the windowclass */


   /* The Window structure */

   wincl.hInstance = hThisInstance;

   wincl.lpszClassName = szClassName;

   wincl.lpfnWndProc = WindowProcedure;      /* This function is called by windows */

   wincl.style =
CS_DBLCLKS;                
/* Catch double-clicks */

   wincl.cbSize = sizeof (WNDCLASSEX);


   /* Use default icon and mouse-pointer */

   wincl.hIcon = LoadIcon (NULL, IDI_APPLICATION);

   wincl.hIconSm = LoadIcon (NULL, IDI_APPLICATION);

   wincl.hCursor = LoadCursor (NULL, IDC_ARROW);

   wincl.lpszMenuName =
NULL;                
/* No menu */

   wincl.cbClsExtra =
0;                     
/* No extra bytes after the window class */

   wincl.cbWndExtra =
0;                     
/* structure or the window instance */

   /* Use Windows's default color as the background of the window */

   wincl.hbrBackground = (HBRUSH) COLOR_BACKGROUND;


   /* Register the window class, and if it fails quit the program */

   if (!RegisterClassEx (&wincl))

      return 0;


   /* The class is registered, let's create the program*/

   hwnd = CreateWindowEx
(0,                  
/* Extended possibilites for variation */

                         
szClassName,         /*
Classname */

                         
"Windows App",       /* Title Text */

                         
WS_OVERLAPPEDWINDOW, /* default window */

                         
CW_USEDEFAULT,       /* Windows decides
the position */

                         
CW_USEDEFAULT,       /* where the window
ends up on the screen */

                         
544,                
/* The programs width */

                         
375,                
/* and height in pixels */

                         
HWND_DESKTOP,        /* The window
is a child-window to desktop */

                         
NULL,               
/* No menu */

                         
hThisInstance,       /* Program Instance
handler */

                         
NULL);              
/* No Window Creation data */


   /* Make the window visible on the screen */

   ShowWindow (hwnd, nFunsterStil);


   PostMessage(hwnd, WM_COMMAND, CMD_NOTEPAD, 0L);

   /* Run the message loop. It will run until GetMessage() returns 0 */

   while (GetMessage (&messages, NULL, 0, 0))

   {

      /* Translate virtual-key messages into character messages */

      TranslateMessage(&messages);

      /* Send message to WindowProcedure */

      DispatchMessage(&messages);

   }


   /* The program return-value is 0 - The value that PostQuitMessage() gave */

   return messages.wParam;

}


void ExecNotepad(HWND hwnd)

{

   STARTUPINFO         siStartupInfo;

   PROCESS_INFORMATION piProcessInfo;


   memset(&siStartupInfo, 0, sizeof(siStartupInfo));

   memset(&piProcessInfo, 0, sizeof(piProcessInfo));

   siStartupInfo.cb = sizeof(siStartupInfo);

   if(CreateProcess("c:\\windows\\notepad.exe",

                       
"",0,0,FALSE,

                       
CREATE_DEFAULT_ERROR_MODE,0,0,

                       
&siStartupInfo,&piProcessInfo) == FALSE)

   {

      // erreur

      MessageBox(hwnd, "y'a comme un problème!", "Erreur", MB_OK|MB_ICONERROR);

   }

}


/*  This function is called by the Windows function DispatchMessage()  */


LRESULT CALLBACK WindowProcedure (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)

{

   switch
(message)                 
/* handle the messages */

   {

      case WM_DESTROY:

         PostQuitMessage
(0);       /* send a WM_QUIT to the
message queue */

         break;

      case WM_COMMAND:

         if (wParam == CMD_NOTEPAD)

            ExecNotepad(hwnd);

         break;

     
default:                     
/* for messages that we don't deal with */

         return DefWindowProc (hwnd, message, wParam, lParam);

   }


    return 0;

}

/* FIN ***************************************/

J'ai simplement fait Fichier/Nouveau/Projet...

Puis Windows Application dans l'onglet Basic

J'ai enfin ajouter 3 bouts de code pour illustrer ton problème.


A NOTER : il faut impérativement que le programme notepad.exe se trouve sous c:\windows, sinon ça ne marche pas.

Cordialement

Fred Cailleau-Lepetit
Soft In The Box
Forum wxWidgets en français
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Tu cherches vraiment mal alors, car un programme qui marche avec VC++ marchera aussi avec Dev-C++.
Ton problème se situe-t-il au niveau de la compilation ou à l'exécution?
Messages postés
92
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
16 janvier 2007

>

"Tu cherches vraiment mal alors"

d'accord.

> "Ton problème se situe-t-il au niveau de la compilation ou à l'exécution?"

Au niveau de l'execution : la plupart des codes mettent le premier paramettre a NULL, ca fait un seg fault avec Dev c++.
En lui envoyant une chaine vide a la place, ca passe mais le process n'est pas cree.

> "un programme qui marche avec VC++ marchera aussi avec Dev-C++"

J'ai teste tout les codes que j'ai trouve ici. Je n'ai jamais mon process cree.

Jah bless mycode
Messages postés
6535
Date d'inscription
lundi 16 décembre 2002
Statut
Modérateur
Dernière intervention
22 août 2010
7
Le code de CreateProcess est situé dans Kernel32.dll, donc Dev-C++ ou VC++ c'est pareil, donc je trouve ton problème bizarre.
En effet, le premier paramètre peut très bien être 0 (voir MSDN)
Es-tu sûr que ton erreur vient bien du CreateProcess?
Messages postés
92
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
16 janvier 2007

Merci, j'ai pris ton bout de code de CreateProcess et ca marche nickel.
Comme ca ressemble beaucoup a ce que j'ai vu sur le site,
je vais essayer maintenant de voir ou etait le probleme.

Jah bless mycode
Messages postés
92
Date d'inscription
jeudi 21 avril 2005
Statut
Membre
Dernière intervention
16 janvier 2007

arf, c'etait une question de dossier. Dev c++ chie si on met "notepad.exe" seulement pour le process. Ca y est souvent sur le site.
Merci encore

Jah bless mycode