Я пытаюсь написать оболочку для входных плагинов Winamp и наткнулся на небольшую загадку.Я бы хотел, чтобы моя оболочка могла отображать диалоговое окно конфигурации плагина, которое (или должно быть) достигается путем вызова функции плагина Config (HWND hwndParent).
Для большинства плагинов, это работает нормально, и моя программа может отображать диалог конфигурации плагина.Однако 64th Note (плагин для воспроизведения файлов USF) вызывает у меня проблемы.Winamp может отобразить свое диалоговое окно конфигурации просто отлично, но всякий раз, когда я пытаюсь отобразить его из своей обертки, диалоговое окно уничтожается до того, как оно само себя покажет.К счастью, 64th Note является открытым исходным кодом, поэтому я взглянул на его внутренности, чтобы попытаться понять, что происходит не так.Я обрезал нерелевантные биты и у меня осталось следующее:
Функция конфигурации в плагине (должен отображаться диалог конфигурации):
void Config(HWND hwndParent) {
DialogBox(slave, (const char *) IDD_CONFIG_WINDOW, NULL, configDlgProc);
}
(Slave - это дескриптор HINSTANCE DLL плагина.) Процедура для диалогового окна выглядит следующим образом (я удалил всю функциональность, поскольку она, похоже, не влияет на эту проблему):
BOOL CALLBACK configDlgProc(HWND hDlg, UINT uMsg, WPARAM wParam, LPARAM lParam) {
return 0;
}
Шаблон для IDD_CONFIG_WINDOW выглядит следующим образом:
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
Естественно, без какого-либо вещества в функции proc диалоговое окно не имеет никакой функциональности, но оно по-прежнему отображается в Winamp при вызове функции Config.Тем не менее, он не появляется, когда я вызываю его из моей программы-оболочки.Когда я наблюдал за сообщениями, отправляемыми в диалог в его функции proc, я видел, что WM_DESTROY и WM_NCDESTROY были отправлены в течение первых нескольких сообщений, хотя я понятия не имею, почему.
Если я изменю функцию Config так,что он отображает диалоговое окно «О программе» плагина, а не диалоговое окно конфигурации, и Winamp и my wrapper будут отображать диалоговое окно «О программе», которое предполагает наличие чего-то уникального в шаблоне диалога конфигурации, вызывающегоэта проблема.Измененная функция Config выглядит следующим образом:
void Config(HWND hwndParent) {
DialogBox(slave, (const char *) IDD_ABOUTBOX, NULL, configDlgProc);
}
Шаблон для диалогового окна About выглядит следующим образом:
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
Как я уже сказал, моя оболочка отображает диалоговое окно About просто так, какделает Winamp.Почему Winamp может отображать диалоговое окно Config, а моя оболочка - нет?