2010-03-22 7 views
2

Je suis en train d'écrire un wrapper pour les plugins d'entrée Winamp et je suis tombé sur un petit problème. Je voudrais que mon wrapper soit capable d'afficher la boîte de dialogue de configuration d'un plugin, qui est (ou devrait être être) en appelant la fonction Config (HWND hwndParent) du plugin.Pourquoi mon programme ne peut-il pas afficher cette boîte de dialogue alors qu'un autre programme peut le faire?

Pour la plupart des plugins, cela fonctionne très bien et mon programme est capable d'afficher la boîte de dialogue de configuration du plugin. Cependant, 64th Note (un plugin pour jouer des fichiers USF) me donne des problèmes. Winamp peut très bien afficher sa boîte de dialogue de configuration, mais chaque fois que j'essaie de l'afficher à partir de mon wrapper, la boîte de dialogue est détruite avant même qu'elle ne s'affiche. Heureusement, 64th Note est open source, alors j'ai jeté un oeil à ses entrailles pour essayer de me faire une idée de ce qui ne va pas. J'ai rogné les bits non pertinents et je suis parti avec ceci:

fonction Config dans le plug-in (doit montrer de dialogue de configuration):

void Config(HWND hwndParent) { 
    DialogBox(slave, (const char *) IDD_CONFIG_WINDOW, NULL, configDlgProc); 
} 

(Slave est le plugin poignée HINSTANCE de DLL.) Le proc pour la boîte de dialogue est la suivante (j'ai dépouillé toutes les fonctionnalités, car il ne semble pas avoir une influence sur ce problème):

BOOL CALLBACK configDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) { 
return 0; 
} 

le modèle de IDD_CONFIG_WINDOW se présente comme suit:

IDD_CONFIG_WINDOW DIALOGEX 0, 0, 269, 149 
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "64th Note configuration" 
FONT 8, "MS Sans Serif", 0, 0, 0x0 
BEGIN 
    DEFPUSHBUTTON "OK",IDOK,212,38,50,14 
    CONTROL   "Play Forever",IDC_NOLENGTH,"Button",BS_AUTORADIOBUTTON,7,7,55,8 
    CONTROL   "Always Use Default Length",IDC_SETLEN,"Button",BS_AUTORADIOBUTTON,7,17,101,8 
    CONTROL   "Default Length",IDC_DEFLEN,"Button",BS_AUTORADIOBUTTON,7,29,63,8 
    EDITTEXT  IDC_DEFLENVAL,71,28,38,12,ES_AUTOHSCROLL 
    EDITTEXT  IDC_DEFFADEVAL,71,42,38,12,ES_AUTOHSCROLL 
    CONTROL   "Detect Silence",IDC_DETSIL,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,7,56,63,8 
    EDITTEXT  IDC_DETSILVAL,71,56,38,12,ES_AUTOHSCROLL 
    CONTROL   "Slider2",IDC_PRISLIDER,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,74,90,108,11 
    EDITTEXT  IDC_TITLEFMT,7,127,255,15,ES_AUTOHSCROLL 
    CONTROL   "Default to file name on missing field",IDC_FNONMISSINGTAG, 
        "Button",BS_AUTOCHECKBOX | WS_TABSTOP,50,114,124,8 
    CONTROL   "Use Recompiler CPU",IDC_RECOMPILER,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,7,83,8 
    CONTROL   "Round Frequency",IDC_ROUNDFREQ,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,16,73,8 
    CONTROL   "Seek Backwards",IDC_BACKWARDS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,26,70,8 
    CONTROL   "Fast Seek",IDC_FASTSEEK,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,35,48,8 
    CONTROL   "RSP Sections",IDC_SECTIONS,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,45,60,8 
    CONTROL   "Soft Amplify",IDC_SOFTAMP,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,54,53,8 
    CONTROL   "Audio HLE",IDC_AUDIOHLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,63,50,8 
    CONTROL   "Auto Audio HLE",IDC_AUTOAUDIOHLE,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,72,64,8 
    CONTROL   "Display Errors",IDC_DISPERROR,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,145,81,58,8 
    EDITTEXT  IDC_RELVOL,211,104,28,12,ES_AUTOHSCROLL 
    PUSHBUTTON  "Cancel",IDCANCEL,212,54,50,14 
    PUSHBUTTON  "Help",IDHELPBUTTON,212,71,50,14 
    LTEXT   "Title format:",IDC_STATIC,7,113,38,8 
    LTEXT   "seconds",IDC_STATIC,112,29,28,8 
    LTEXT   "Default Fade",IDC_STATIC,19,43,42,8 
    LTEXT   "seconds",IDC_STATIC,112,43,28,8 
    LTEXT   "seconds",IDC_STATIC,112,57,28,8 
    CTEXT   "CPU Thread Priority",IDC_STATIC,7,91,63,8 
    CTEXT   "Look ma, I'm data!",IDC_CPUPRI,75,104,108,8 
    LTEXT   "Relative Volume",IDC_STATIC,199,94,52,8 
    LTEXT   "Fade Type",IDC_STATIC,7,75,35,8 
    COMBOBOX  IDC_FADETYPE,45,72,87,74,CBS_DROPDOWNLIST | WS_TABSTOP 
END 

Naturellement, sans aucune substance dans la fonction proc, la boîte de dialogue n'a aucune fonctionnalité, mais elle s'affiche toujours dans Winamp lorsque la fonction Config est appelée. Cependant, il n'apparaît pas lorsque je l'appelle depuis mon programme d'encapsulation. Quand j'ai surveillé les messages envoyés à la boîte de dialogue dans sa fonction proc, j'ai vu que WM_DESTROY et WM_NCDESTROY ont été envoyés dans les premiers messages, bien que je n'ai aucune idée de pourquoi.

Si je change la fonction Config afin qu'il affiche le plugin de dialogue À propos de la place de la boîte de dialogue de configuration, à la fois Winamp et mon emballage va afficher la dialogue A propos, ce qui suggère qu'il ya quelque chose d'unique à la boîte de dialogue de configuration modèle qui cause le problème. La fonction de configuration modifiée se lit comme ceci:

void Config(HWND hwndParent) { 
    DialogBox(slave, (const char *) IDD_ABOUTBOX, NULL, configDlgProc); 
} 

Le modèle de la boîte de dialogue est la suivante À propos:

IDD_ABOUTBOX DIALOGEX 0, 0, 152, 151 
STYLE DS_SETFONT | DS_MODALFRAME | WS_POPUP | WS_CAPTION | WS_SYSMENU 
CAPTION "About 64th Note" 
FONT 8, "MS Sans Serif", 0, 0, 0x1 
BEGIN 
    LTEXT   "64th Note v1.2 beta 3\nBased on Project 64 1.6 by Zilmar and Jabo\nAudio HLE by Azimer\nPSF concept and tagging by Neill Corlett\nPlayer by hcs, Josh W, dr0\nhttp://hcs64.com/usf",IDC_STATIC,7,94,138,50 
    CONTROL   110,IDC_STATIC,"Static",SS_BITMAP,26,7,95,86,WS_EX_DLGMODALFRAME 
END 

Comme je l'ai dit, mon emballage affiche la boîte de dialogue très bien, tout comme A propos de Winamp. Pourquoi Winamp peut-il afficher la boîte de dialogue Config, alors que mon wrapper ne le peut pas?

Répondre

2

Peut-être n'avez-vous pas enregistré le WNDCLASS du contrôle de la barre de contrôle? Vous devez charger la DLL de contrôle commun avant de pouvoir l'instancier.

Je cherche spécifiquement à cette ligne:

CONTROL   "Slider2",IDC_PRISLIDER,"msctls_trackbar32",TBS_AUTOTICKS | WS_TABSTOP,74,90,108,11 

EDIT: Vous aurez besoin d'établir des liens avec comctl32.lib et appelez InitCommonControlsEx lors de votre démarrage du programme.

+0

Yay !!! En utilisant Code :: Blocks, il continuait à dire que InitCommonControlsEx n'était pas déclaré (même lors de la liaison avec comctl32 et en incluant commctrl.h) mais j'ai essayé les anciens InitCommonControls et ça a marché!Si quelqu'un sait d'ailleurs comment résoudre ce problème non déclaré InitCommonControlsEx, alors c'est génial aussi, mais le show-stopper est au moins résolu et je peux enfin procéder avec mon wrapper! – nonoitall

+0

Est-ce que ça dépend si "#include " est avant ou après le "#include "? – Default

+0

Je viens d'obtenir l'erreur non déclarée si vient après . Je reçois comme 50+ erreurs si le vient avant . (Des choses comme "DWORD ne nomme pas un type" ou "HINSTANCE ne nomme pas un type".) – nonoitall

Questions connexes