Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   С/С++, C#, Delphi, .NET, Asm (https://forum.antichat.xyz/forumdisplay.php?f=24)
-   -   Студия и диалоговые приложения (https://forum.antichat.xyz/showthread.php?t=191952)

ntldr 30.03.2010 23:47

Студия и диалоговые приложения
 
Я уже много времени мучаюсь с проблемой - при создании приложения с главным окном в виде диалога из пустого проекта (без всяких stdafx и т.д.), оно просто не работает. То есть запускается и сразу закрывается.

общий вид кода такой:

PHP код:

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 hDlgUINT messageWPARAM wParamLPARAM lParam)
{
    return (
INT_PTR)FALSE;


1)В отладчике проверял - FindResourceEx(), вызываемый DialogBox() возвращает ноль при поиске ресурса диалога.
2)Этот ресурс ЕСТЬ
3)Такой бодяги нет при создании проекта с stdafx

Пожалуйста помогите, я уже просто зае....ся :(

ntldr 30.03.2010 23:58

Цитата:

Первый этап обработки исключения в "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 31.03.2010 09:23

Цитата:

Сообщение от transserg
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 и соответственно таким образом вызвал диалог:

PHP код:

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     
HINSTANCE hPrevInstance,
                     
LPTSTR    lpCmdLine,
                     
int       nCmdShow)
{
    
DialogBox((HINSTANCE)0x400000,MAKEINTRESOURCE(IDD_DIALOG1),0,MainWnd);
    return 
0;



Gar|k 31.03.2010 10:16

ntldr не делай так
лучше пропиши тогда уж hInstance=GetModuleHandle(NULL); хистанс у тебя не правильный из-за не правильной главной функции она должна называться WinMain (CRT потом сам сделает все что нужно - я про юникод)
а вообще http://msdn.microsoft.com/en-us/library/ms644996(v=VS.85).aspx

ntldr 31.03.2010 11:14

Цитата:

Сообщение от Gar|k
ntldr не делай так
лучше пропиши тогда уж hInstance=GetModuleHandle(NULL); хистанс у тебя не правильный из-за не правильной главной функции она должна называться WinMain (CRT потом сам сделает все что нужно - я про юникод)
а вообще http://msdn.microsoft.com/en-us/library/ms644996(v=VS.85).aspx

вот вот, я так же хотел сделать :)


Время: 01:10