WinMain не вызывается перед main (проблема с точкой входа программы C/C++)

У меня сложилось впечатление, что этот код

#include <windows.h>

#include <stdio.h>

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, PSTR szCmdLine, int iCmdShow)
{
    printf("WinMain\n");

    return 0;
}

int main()
{
    printf("main\n");

    return 0;
}

выведет WinMain, но, конечно, ничего не работает так, как вы ожидаете.

В любом случае, не мог бы кто-нибудь сказать мне, как заставить эту программу сначала запускать WinMain (у меня есть причина использовать оба). Я запускаю Windows 7 с mingw, если это что-то помогает.


person BT.    schedule 12.04.2010    source источник
comment
Ваше использование before заставляет меня поверить, что вы думаете, что будет вызван один main, а затем другой. Но главное только одно. (Не имеет смысла иметь два основных.)   -  person GManNickG    schedule 12.04.2010
comment
простите, бедный язык. Я не планирую использовать их одновременно (это подразумевает определенное представление об уровне моего интеллекта, которое мне не очень нравится, да ладно). Я собирался внедрить main в WinMain позже.   -  person BT.    schedule 12.04.2010


Ответы (3)


Вам нужно поместить -mwindows в командную строку, когда вы вызываете MinGw. Ознакомьтесь с этим в качестве краткого введения в программирование Windows с помощью MinGW.

Кроме того: у вас не может быть двух точек входа в исполняемом файле, поэтому вы, вероятно, не можете делать то, что хотите.

person Travis Gockel    schedule 12.04.2010
comment
Извините, что не сработало. Я изменил код на ‹Code› printf(main\n); MessageBox (NULL, ТЕКСТ (основной), ТЕКСТ (основной), 0) ; вернуть 0; ‹/Code› в main и угадайте, кто появился. Я надеюсь, вы не правы, что использование обоих невозможно, потому что я видел, как это делается с SDL и подобными библиотеками, я просто не уверен, что отличалось. - person BT.; 12.04.2010
comment
@BT: Нет, у вас не может быть двух сетей. Это не имеет смысла. Как вы думаете, зачем вам две сети? - person GManNickG; 12.04.2010
comment
@BT: вы можете определить обе основные функции, но только одна из них будет вызываться. - person Travis Gockel; 12.04.2010
comment
@GMan: я пытался создать простую библиотеку графического интерфейса, которая скрыла бы большую часть кода от пользователя во время инициации в WinMain и использовала бы основной, который пользователь предоставляет после того, как все будет инициировано. Это просто сделает код чище и уменьшит путаницу (поверьте мне, так оно и есть). Что касается двух сетей, это не то, что я пытаюсь. Я пытаюсь получить точку входа WinMain (запрограммированную мной), которая затем вызовет main (запрограммированную пользователем библиотеки - больше всего похоже на меня). - person BT.; 12.04.2010
comment
@Travis G: Я знаю это. Я могу создать столько основных определений, сколько захочу, но мне нужен способ управления точкой входа в программу. Я зависел от компилятора, чтобы предоставить метод для этого. - person BT.; 12.04.2010
comment
@BT: Это так. Если вы компилируете с помощью -mwindows, он выбирает WinMain, в противном случае используется классическая функция main. Если вы скомпилируете с UTF8, он выберет функцию main с wchar_t. Но вы получаете только одну точку входа на каждый скомпилированный двоичный файл. - person Travis Gockel; 12.04.2010
comment
@Travis G: У меня это не работает. Я использую версию 3.4.5. Проверю, есть ли у них что-нибудь в журналах ошибок. - person BT.; 12.04.2010
comment
@BT: Есть ли причина, по которой вы используете такую ​​старую версию? MinGW обновлен до версии 4.4, хотя их автоматический установщик намного устарел и не поддерживается. Я бы порекомендовал получить последнюю версию MinGW через Cygwin для меньшей боли, чем компилировать ее самостоятельно. - person Travis Gockel; 12.04.2010
comment
@BT: я думаю, что ваш тест неисправен. Если вы свяжете программу как программу Windows, она не подключит stdout и др.; таким образом, printf никогда ничего вам не даст. Однако вы можете сделать это вручную; см. halcyon.com/~ast/dload/guicon.htm - person Luke; 12.04.2010
comment
@Luke: это крутая статья, чувак, но что касается тестирования, просто добавить окно сообщения намного проще. - person BT.; 13.04.2010

Компилятор выберет ту или иную точку входа в зависимости от того, нацеливаете ли вы скомпилированный вывод на подсистему Windows или на подсистему консоли. WinMain для первого, main для второго.

person sblom    schedule 12.04.2010

Просто нашел эту работу и немного чувствую себя глупо.

#define main USER_Main

Затем это выводит main из строя за то, что она является точкой входа программы, но при этом скрывает тот факт, что что-то было перепутано с пользователем.

person BT.    schedule 21.04.2010