Ошибка в DialogBox( ) - HELP
![]() |
Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
|
| ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
| [216.73.216.91] |
|
|
Правила раздела Visual C++ / MFC / WTL (далее Раздела)
FAQ Раздела
Обновления для FAQ Раздела
Поиск по Разделу
MSDN Library Online
Ошибка в DialogBox( ) - HELP
|
Сообщ.
#1
,
|
|
|
|
Компилю в Билдере , а он и выдаёт:
[C++ Error] Resource.cpp(90): E2034 Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' [C++ Error] Resource.cpp(90): E2342 Type mismatch in parameter 'lpDialogFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,unsigned int,unsigned int,long)') Понятно что ему не нравится указатель на ф-ию но почему ? Не понятно почему он это делает ведь все объявленно правильно (несколько раз проверял). .......... case WM_COMMAND: switch(wParam) { case IDM_ViewString: MessageBox(NULL,"view","Test",MB_OK); break; case IDM_ChooseString: DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc); break; ................ } BOOL CALLBACK SpinDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam) { .... } |
|
Сообщ.
#2
,
|
|
|
|
прототипа функции нет?
а определение твоей коллбэк функции случайно не после использования в: DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc); ? |
|
Сообщ.
#3
,
|
|
|
|
прототип есть
LRESULT CALLBACK TestWndProc(HWND,UINT,UINT,LONG); BOOL CALLBACK SpinDialogProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE hInst; А с прототипом все равно где опредлен. |
|
Сообщ.
#4
,
|
|
|
|
вообще то не все равно где он определен. Он должен быть определен в этом же модуле и обязательно до вызова DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc);
|
|
Сообщ.
#5
,
|
|
|
|
Я пробовал определять и до и после
(кстати и Petzold'a определенно после). |
|
Сообщ.
#6
,
|
|
|
|
я не правильно выразился:
А с прототипом все равно где опредлен. ...... А с прототипом все равно где опредлен код ф-ии. |
|
Сообщ.
#7
,
|
|
|
|
Вот куски кода:
///// *.cpp #include <vcl.h> #include "Test.h" USERC("Test.rc"); // прототипы ф-ий LRESULT CALLBACK TestWndProc(HWND,UINT,UINT,LONG); BOOL CALLBACK SpinDialogProc(HWND,UINT,WPARAM,LPARAM); HINSTANCE hInst; //--------------------------------------------------------------------------- WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR szCommandLine, int nCmdShow) { HWND hWnd; WNDCLASS WndClass; MSG Msg; char szClassName[] = "ResTest"; hInst=hInstance; ............. InitCommonControls(); .......... return Msg.wParam; } LRESULT CALLBACK TestWndProc(HWND hWnd,UINT Msg,UINT wParam,LONG lParam) { switch (Msg) { case WM_CREATE : return 0; case WM_COMMAND: switch(wParam) { case IDM_ViewString: MessageBox(NULL,"view","Test",MB_OK); break; case IDM_ChooseString: DialogBox(hInst,"SpinDialog",hWnd,SpinDialogProc); break; .............. .......... return DefWindowProc (hWnd,Msg,wParam,lParam); } BOOL CALLBACK SpinDialogProc(HWND hDlg,UINT Msg,WPARAM wParam,LPARAM lParam) { static HWND hEditWnd; static HWND hSpinWnd; switch(Msg) { case WM_INITDIALOG: hEditWnd = GetDlgItem(hDlg,Id_Edit); hSpinWnd = CreateUpDownControl(WS_CHILD|WS_BORDER|WS_VISIBLE| UDS_SETBUDDYINT|UDS_ALIGNRIGHT, 0,12,50,50, hDlg,Id_Spin,hInst,hEditWnd,100,0,50); return TRUE; case WM_COMMAND: switch(LOWORD(wParam)) { case Id_OK: EndDialog(hDlg,0); return TRUE; } break; } return FALSE; } ////////// *.rc SpinDialog DIALOG 0,0,100,100 STYLE DS_MODALFRAME | DS_3DLOOK | WS_POPUP|WS_VISIBLE|WS_CAPTION|WS_SYSMENU CAPTION "Choose String" FONT 8,"Ms Sahs Serif" { DEFPUSHBUTTON "OK",Id_OK,25,60,50,14 CONTROL "",Id_Edit,"edit",ES_LEFT|WS_CHILD|WS_VISIBLE|WS_BORDER|WS_TABSTOP| ES_NUMBER,25,20,50,12 } |
|
Сообщ.
#8
,
|
|
|
|
Цитата klep, 20.03.02, 18:14:04 Компилю в Билдере , а он и выдаёт: [C++ Error] Resource.cpp(90): E2034 Cannot convert 'int (__stdcall *)(void *,unsigned int,unsigned int,long)' to 'int (__stdcall *)()' [C++ Error] Resource.cpp(90): E2342 Type mismatch in parameter 'lpDialogFunc' (wanted 'int (__stdcall *)()', got 'int (__stdcall *)(void *,unsigned int,unsigned int,long)') Понятно что ему не нравится указатель на ф-ию но почему ? Не понятно почему он это делает ведь все объявленно правильно (несколько раз проверял). } попробуй так: typedef int (__stdcall *DLGDUNC)(); А при вызове диалога насильно приведи указатель на функцию к этому типу (DLGFUNC)MyDlgFunc Если нормально заработает, то какая тогда нахрен разница, почему ему тот указатель не нравился ! |
|
Сообщ.
#9
,
|
|
|
|
помогло,спасибо.
|