· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Можно ли в C написать DlgProc чтоб код был с одним ret(максимум двумя)..

<< . 1 . 2 . 3 . >>

Посл.отвђт Сообщенiе


Дата: Окт 4, 2004 10:06:29

q_q „#include <windows.h>“

Действительно , так гораздо лучше :)
Просто windows.h и др. не идут с MS Visual C++ Toolkit 2003 , но благо нашёл на винте соседа заархивированный \DevStudio\VC98 .


Дата: Окт 4, 2004 13:28:07

bogrus
> Просто windows.h и др. не идут с MS Visual C++ Toolkit 2003

они идут с psdk, размер которого в минимальном варианте ~40Mb ;-)


Дата: Окт 4, 2004 13:42:13 · Поправил: Asterix

q_q
> bogrus уже показал __declspec(naked)

Что-то я не понял как мне применить в моём случае, компилятор почему-то ругается.
mini.cpp(22) : error C2561: 'start' : function must return a value
        mini.cpp(16) : see declaration of 'start'


Дата: Окт 4, 2004 15:31:58

Asterix
Показывай весь код.


Дата: Окт 4, 2004 16:33:10 · Поправил: Asterix

q_q
Вот:
#include <windows.h>
#include "resource.h"


#pragma comment(linker, "/ENTRY:start")
#pragma comment(linker, "/opt:nowin98")
#pragma comment(lib, "kernel32.lib")
#pragma comment(lib, "user32.lib")


BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam);
HINSTANCE     hInstance;


// void start(void)
__declspec(naked) start ()
{
   hInstance = GetModuleHandle(NULL);
   DialogBoxParam(hInstance, MAKEINTRESOURCE(IDD_DIALOG_1), 0, (DLGPROC) DlgProc, 0);
   ExitProcess(0);
}


BOOL CALLBACK DlgProc(HWND hwnd, UINT msg, WPARAM wParam, LPARAM lParam)
{
  BOOL r = TRUE;

  switch(msg)
  {
   case WM_INITDIALOG:
      SendMessage(hwnd, WM_SETICON, ICON_BIG,
                 (LPARAM) LoadIcon(hInstance, MAKEINTRESOURCE(MAINICON)));
      SendMessage(hwnd, WM_SETICON, ICON_SMALL,
                 (LPARAM) LoadImage(hInstance, MAKEINTRESOURCE(MAINICON), IMAGE_ICON, 16, 16, 0));
      break;
   case WM_CLOSE:
      EndDialog(hwnd, 0);
      break;
   case WM_COMMAND:
     switch(LOWORD(wParam))
     {
      case IDB_PLAY:
         break;
      case IDB_STOP:
         break;
      case IDB_EXIT:
         SendMessage(hwnd, WM_CLOSE, 0, 0);
         break;
      default:
       r = FALSE;
     }
  }
  return r;
}


Дата: Окт 4, 2004 16:51:13

__declspec(naked) void start(void){


Дата: Окт 4, 2004 17:01:27

Quantum

Спасибо, теперь работает :-)

Ты свой mail на hotmail проверяешь?


Дата: Окт 4, 2004 17:04:09

Asterix
Периодически :-)


Дата: Окт 4, 2004 17:18:49 · Поправил: Asterix

q_q
Тут у тебя ошибка default должен быть сразу после break:
      SendMessage(hwnd, WM_CLOSE, 0, 0);
      break;
    }
  default:
    r = FALSE;

Так что return'ы нагляднее, меньше вероятность ошибиться ;-)

ЗЫ: И у меня тоже неправильно, блин, запутался я в этих break'ах %)


Дата: Окт 4, 2004 17:20:08

Quantum
Ну и.. письмо получил?


Дата: Окт 4, 2004 18:17:36 · Поправил: Quantum

Asterix
Никак нет.

ЗЫ: Написал.


Дата: Окт 4, 2004 18:23:54 · Поправил: Asterix

Quantum
Странно, напиши мне тогда письмо, может у меня адрес не тот..


Дата: Окт 4, 2004 22:30:12 · Поправил: Asterix

Quantum
Отправил снова, получил? :-)
Я как в мультике, удав привет передавал.. :-)
ты там в junk'е посмотри, мои письма hotmail любит туда совать ;-)


Дата: Окт 5, 2004 01:38:47 · Поправил: Quantum

Asterix
Получил!!! И уже ответил.


Дата: Окт 5, 2004 04:01:44

Asterix
Тут у тебя ошибка default должен быть сразу после break
Заблуждаешься. default не является обязательной опцией оператора switch.

По логике твоей DlgProc, TRUE возвращается только если обработаны WM_INITDIALOG, WM_CLOSE, WM_COMMAND + IDC_BUTTON_1, WM_COMMAND + IDC_BUTTON_2 или WM_COMMAND + IDC_BUTTON_3. Эту же логику я и реализовал, обойдясь при этом без наглядных return'ов. Imho использование большого количества return'ов в рамках отдельной подпрограммы плохо сказывается на сопровождении.

<< . 1 . 2 . 3 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.057