Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 6 sur 6
  1. #1
    Nouveau Membre du Club
    Inscrit en
    avril 2011
    Messages
    53
    Détails du profil
    Informations forums :
    Inscription : avril 2011
    Messages : 53
    Points : 32
    Points
    32

    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 :
    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 :
    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 :
    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 : 664
    Points
    664

    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 : 32
    Points
    32

    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 :
    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 : 664
    Points
    664

    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 : 32
    Points
    32

    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 : 32
    Points
    32

    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 :
    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.

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •