p
u
b
l
i
c
i
t
é
publicité
  1. #1
    Nouveau Membre du Club
    Inscrit en
    avril 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 53
    Points : 35
    Points
    35

    Par défaut D - Win32 pointeurs sur fonction et delegate

    Bonjours, je suis face à un problème avec l'API Win32, lors de la définition de la WNDCLASS, je dois passer en paramètre un pointeur sur ma fonction servant a deffinire la procédure interne a la fenêtre (lpfnWndProc de la WNDCLASS), je reçois l'erreur de compilation suivante :
    MyDL\Windows.d|100|Error: cannot implicitly convert expression (&this.mainWindowRuntime) of type int delegate(HANDLE fenetrePrincipale, uint message, uint wParam, int lParam) to int Windows function(HANDLE, uint, uint, int)|
    avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.classeFenetre.lpfnWndProc = &this.mainWindowRuntime;
    et l'erreur suivante
    MyDL\Windows.d|100|Error: function MyDL.windows.Win32Window.mainWindowRuntime (HANDLE fenetrePrincipale, uint message, uint wParam, int lParam) is not callable using argument types ()|
    avec le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.classeFenetre.lpfnWndProc = this.mainWindowRuntime;
    je voudrais donc savoir quel est la bonne syntaxe pour evoyer un pointeur sur ma fonction a la WNDCLASS.

    avec ma mainWindowRuntime définie comme cecis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public int mainWindowRuntime(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
    	{
    		switch (message)
    		{
    			case WM_CREATE:
    				return 0;
    			case WM_DESTROY:
    				PostQuitMessage(0);
    				return 0;
    			default:
    				return DefWindowProcA(fenetrePrincipale, message, wParam, lParam);
    		}
    	}
    Merci d'avance.

  2. #2
    Membre chevronné

    Inscrit en
    mai 2005
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : mai 2005
    Messages : 263
    Points : 665
    Points
    665

    Par défaut

    Bonjour,

    Il faut que ta procédure de fenêtre (mainWindowRuntime) soit une fonction autonome (non membre d'une classe) ou une méthode statique (Win32 c'est du C, et il n'y a pas de classes en C).

  3. #3
    Nouveau Membre du Club
    Inscrit en
    avril 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 53
    Points : 35
    Points
    35

    Par défaut

    Merci ça marche mais ça compromet ce que je pensait faire niveau event

    sinon j'ai aussi un problème avec la fonction CreateWindow :
    je fais ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    this.fenetrePrincipale = CreateWindowA("classeF", "test", WS_OVERLAPPEDWINDOW, 0, 0, 100, 100, null, null, GetModuleHandleA(null) , null);
    cette ligne provoque l’arrêt du programme et revois le statut : -1073741819
    Process terminated with status -1073741819 (0 minutes, 4 seconds)
    Tu sais d'ou ça peut venir ?

  4. #4
    Membre chevronné

    Inscrit en
    mai 2005
    Messages
    263
    Détails du profil
    Informations forums :
    Inscription : mai 2005
    Messages : 263
    Points : 665
    Points
    665

    Par défaut

    Pour les events, rien ne t'empêche (par ex) de forwarder les messages reçus par la procédure de fenêtre à un singleton qui les traitera...

    Pour le crash, je suspecte une confusion entre chaînes C et chaînes D (je n'ai pas de machine Windows sous la main pour tester). Essaie donc de remplacer "classeF" et "test" par "classeF".ptr et "test".ptr et d'utiliser toStringz() quand tes chaînes ne sont pas littérales.

  5. #5
    Nouveau Membre du Club
    Inscrit en
    avril 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 53
    Points : 35
    Points
    35

    Par défaut

    Tu dois avoir raison mais le fait d'ajouter .ptr ou d'utiliser toStringz ne change rien,
    le programme crash avec le même code d'erreur.

  6. #6
    Nouveau Membre du Club
    Inscrit en
    avril 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 53
    Points : 35
    Points
    35

    Par défaut

    Citation Envoyé par ahoff Voir le message
    Tu dois avoir raison mais le fait d'ajouter .ptr ou d'utiliser toStringz ne change rien,
    le programme crash avec le même code d'erreur.
    En fait non : le probleme c'est que ma procédure WinProc n’était pas déclaré __stdcall/CALLBACK

    Pour ceux qui rencontrent des problèmes équivalents, la syntaxe est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern (Windows) int mainWindowRuntime(HWND fenetrePrincipale, UINT message, WPARAM wParam, LPARAM lParam)
    Merci pour ton aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Win32] Pointeur sur fonctions et méthodes de classe
    Par Invité dans le forum Langage
    Réponses: 4
    Dernier message: 13/09/2007, 19h07
  2. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  3. pointeurs sur fonction en C++
    Par cemoi dans le forum C++
    Réponses: 7
    Dernier message: 29/11/2004, 13h19
  4. [langage] Pointeur sur fonction
    Par Fanch.g dans le forum Langage
    Réponses: 2
    Dernier message: 02/10/2004, 10h43
  5. Declaration de fonction retournant un pointeur sur fonction
    Par pseudokifaitladifférence dans le forum C
    Réponses: 5
    Dernier message: 11/08/2003, 19h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo