Просмотр полной версии : Студия и диалоговые приложения
Я уже много времени мучаюсь с проблемой - при создании приложения с главным окном в виде диалога из пустого проекта (без всяких stdafx и т.д.), оно просто не работает. То есть запускается и сразу закрывается.
общий вид кода такой:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox(hInstance,MAKEINTRESOURCE(IDD_DIALOG1),0 ,MainWnd);
return 0;
}
INT_PTR CALLBACK MainWnd(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
return (INT_PTR)FALSE;
}
1)В отладчике проверял - FindResourceEx(), вызываемый DialogBox() возвращает ноль при поиске ресурса диалога.
2)Этот ресурс ЕСТЬ
3)Такой бодяги нет при создании проекта с stdafx
Пожалуйста помогите, я уже просто зае....ся :(
Первый этап обработки исключения в "0x7c9102f6" в "lab14.exe": 0xC0000005: Нарушение прав доступа при чтении "0x0dc7f9d4". - выдал отладчик студии
В общем похоже что в DialogBox передается левый hInstance (наверное из - за рандомного базового адреса), как это можно починить?
transserg
31.03.2010, 08:33
ntldr вот проект от VS2008 в котором главная форма диалог из ресурсов и одна кнопка.. компилится и работает =). писался тоже из пустого проекта ручками.
http://www.multiupload.com/1OI5J94IWZ ссыль на архив с проэктом
INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (wParam)
{
case IDC_BUTTON1:
MessageBox(hwndDlg,L"Тест",L"!!!!!",MB_OK);
return INT_PTR(TRUE);
}
case WM_INITDIALOG:
{
return INT_PTR(TRUE);
}
case WM_CLOSE :
EndDialog(hwndDlg,wParam);
return INT_PTR(TRUE);
case WM_DESTROY :
EndDialog(hwndDlg,wParam);
return INT_PTR(TRUE);
}
return 0;
}
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
DialogBoxParam(hInstance, MAKEINTRESOURCE (IDD_DIALOG1), HWND_DESKTOP, (DLGPROC)DialogProc, 0);
}
в проекте всего 2 функции =)
ntldr вот проект от VS2008 в котором главная форма диалог из ресурсов и одна кнопка.. компилится и работает =). писался тоже из пустого проекта ручками.
http://www.multiupload.com/1OI5J94IWZ ссыль на архив с проэктом
INT_PTR CALLBACK DialogProc(HWND hwndDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
switch (uMsg)
{
case WM_COMMAND:
switch (wParam)
{
case IDC_BUTTON1:
MessageBox(hwndDlg,L"Тест",L"!!!!!",MB_OK);
return INT_PTR(TRUE);
}
case WM_INITDIALOG:
{
return INT_PTR(TRUE);
}
case WM_CLOSE :
EndDialog(hwndDlg,wParam);
return INT_PTR(TRUE);
case WM_DESTROY :
EndDialog(hwndDlg,wParam);
return INT_PTR(TRUE);
}
return 0;
}
int CALLBACK WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd)
{
DialogBoxParam(hInstance, MAKEINTRESOURCE (IDD_DIALOG1), HWND_DESKTOP, (DLGPROC)DialogProc, 0);
}
в проекте всего 2 функции =)
Я уж не знаю, как так получилось, но подозреваю, что дело в том, что у тебя главная функция WinMain, а у меня какая-то левая. :confused:
Хотя я уже решил проблему, прописав в свойствах проекта фиксированный адрес базы 0x400000 и соответственно таким образом вызвал диалог:
int APIENTRY _tWinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
DialogBox((HINSTANCE)0x400000,MAKEINTRESOURCE(IDD_ DIALOG1),0,MainWnd);
return 0;
}
ntldr не делай так
лучше пропиши тогда уж hInstance=GetModuleHandle(NULL); хистанс у тебя не правильный из-за не правильной главной функции она должна называться WinMain (CRT потом сам сделает все что нужно - я про юникод)
а вообще http://msdn.microsoft.com/en-us/library/ms644996(v=VS.85).aspx
ntldr не делай так
лучше пропиши тогда уж hInstance=GetModuleHandle(NULL); хистанс у тебя не правильный из-за не правильной главной функции она должна называться WinMain (CRT потом сам сделает все что нужно - я про юникод)
а вообще http://msdn.microsoft.com/en-us/library/ms644996(v=VS.85).aspx
вот вот, я так же хотел сделать :)
vBulletin® v3.8.14, Copyright ©2000-2026, vBulletin Solutions, Inc. Перевод: zCarot