Как избавиться от .NET?

Тема в разделе "WASM.BEGINNERS", создана пользователем Lightwell, 2 окт 2007.

  1. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    Здравствуйте все!
    Прошу помощи, потому что сам уже замучался.
    Я хочу создать приложение Windows с окошками на Си++ и для этого у меня есть VS2005. НО: когда создается проект Win32, то это управляемый Си++ для запуска в CLR. Мне нужно получать и обрабатывать разные сообщения для моего окошка, а я даже не могу найти цикл обработки сообщений. Как мне откопать под слоем фрэймворка цикл? По теме обработки сообщений в NET была найдена статья: www.gotdotnet.ru/DotNet/FAQ/WindowsForms/Misc/326.aspx Но там примеры на C#. В итоге я не знаю как мне разобраться с событиями. Подскажите, что делать.
     
  2. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    New - Project - Visual C++ - Win32 - Win32 Project.
     
  3. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    А где там сообщения обрабатываются?
     
  4. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    В WndProc. Там создаётся заготовка проги. А ещё сходил бы на firststeps.ru, там для начинающих дока по WinAPI & K°.
     
  5. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    Спасибо, буду читать. Пока ждал ответа, нашел в МСДН, что можно получать сообщения окна, установив некий перехватчик.

    LRESULT CALLBACK HookProc(int nCode, WPARAM wParam, LPARAM lParam)
    {
    return 0;
    };

    HHOOK h;
    HOOKPROC HookProcH;

    HookProcH = (HOOKPROC)GetProcAddress(GetModuleHandle(NULL), "HookProc");
    h = SetWindowsHookEx(WH_GETMESSAGE, HookProcH, NULL, 0);

    Почему не работает?
     
  6. planet

    planet New Member

    Публикаций:
    0
    Регистрация:
    10 апр 2007
    Сообщения:
    108
    не рано ли ты за хуки берешься ?) в HookProc нужно обязательно вызывать CallNextHookEx иначе все сообщения дальше твоей функции не пойдут.
    да и зачем так извращатся, в своей проге ставить хуки чтобы сообщения обработать, хм ЫЫ ) все решается через WndProc
     
  7. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
  8. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    При компиляции возникает ошибка:

    1>d:\studio\proj\proj\Form1.h(147) : error C2664: 'ESNFunction' : cannot convert parameter 2 from 'boolean (__stdcall *)(char *,unsigned long)' to 'ESNCB'

    хотя функция объявлена как ESNFunction (StreamT_t streamType, ESNCB userCB, unsigned long lParam) и

    тип ESNCB
    typedef Boolean ( *ESNCB) (char *serverName, unsigned long lParam);
    Моя функция:
    boolean __stdcall AddServer(char* ServName,unsigned long lParam)
    {
    static int q=0;
    ServerID_t* w = (ServerID_t*) lParam;
    lstrcpy((LPSTR)w,(LPSTR)ServName);
    q++;
    if (q>1)
    {return 0;}
    else return 1;
    }

    Вызов:
    t = ESNFunction(ST_CSTA, AddServer, (unsigned long)&ServerName);

    Что я сделал неправильно?
     
  9. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Lightwell
    На первый взгляд: AddServer у тебя stdcall, а в ESNCB этого не указано и зависит от настроек компилятора.
     
  10. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    Хм... В документации сказано, что должно быть stdcall. Но без него работает. У меня еще один глуповатый вопрос. Чтобы запустить приложение как сервис, что нужно сделать?
     
  11. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    Почитал описание про окна. Там указатель на функцию WndProc используется при заполнении структуры класса окна.
    Как я понял, мне надо объявить такую же функцию у себя:

    public ref class Form1 : System::Windows::Forms::Form
    { ...//конструктор и др. мелочи

    //моя функция
    protected:
    LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)
    {
    if (Message == WM_DESTROY )
    {
    PostQuitMessage(0);
    return 0;
    }
    return DefWindowProc(hwnd,Message,wparam,lparam);
    }

    ...//еще несколько функций
    }
    Но оно все равно не хочет работать. Почему?
     
  12. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Это ж Managed C++, а вы вроде хотите избавится от dotnet
     
  13. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    нужно еще static добавить
     
  14. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    Конечно, хочу! Только я посмотрел и понял, что если я буду без него, то придется окошки программно создавать. Это слишком утомительно, учитывая сколько другой работы надо сделать. Поэтому рисую дизайнером в Managed C++. Или можно рисовать без фрэймворка?
    static LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam) так добавить нужно? Добавил, но выполнение на функцию не переходит.
     
  15. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    :)

    Редактор win32 ресурсов не поможет? Правда, код обработчиков писать руками. Эти ресурсы, понятно, слабее, чем в делфи, но, в принципе, альтернатив не много. Вообще, тебе шашечки или ехать?
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Может посоветовать ему visg? (поиск по форуму)
     
  17. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    Мне и то и другое, то есть Borland C Builder. Но библиотеки от смежной конторы поставляются в уже откомпилированном виде. Причем откомпилированы они в студии, а линковщик от борланды их не принимает. Пишет типа формат неверный. :-(((( Я начинаю понимать, за что майкрософт не любят... Так что посоветуете, господа?
     
  18. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Возьми QT и не парься. С++, визуальное построение интерфейса, мощная и стройная архитектура.
     
  19. gazlan

    gazlan Member

    Публикаций:
    0
    Регистрация:
    22 май 2005
    Сообщения:
    414
    Г*но..., IMHO. И не С++ (Sic!), и интерфейс дрянь (нет возможности фиксировать элементы на форме, все тянется как драный гонд*н), неудобная система автонаименований визуальных объектов, вообще стандарт Qt на наименования объектов просто не дает хорошо писать (разве что тотально переименовывать все и вся), архитектура без восторгов, причем несовместимая ни с чем другим. Скажем, часть системных API вызовов из под Qt просто не работает (тот же таймер под Linux). А часть Qt API - это просто обертка к не лучшим библиотекам третьих фирм (qCompress <-> ZLib). Наконец, Unicode - без выбора - и там , где он нафиг не нужен.
     
  20. Lightwell

    Lightwell New Member

    Публикаций:
    0
    Регистрация:
    28 окт 2006
    Сообщения:
    14
    gazlan
    А там(в QT) какой-то неправильный Си++ или чем он плох?