Создание консольных приложений без CRT и заголовков по умолчанию?

Используйте это:

public abstract class AbstractDAProcedureMenuReceivedHandler<T extends AbstractDAProcedureMenuReceivedEvent> extends DaCommonEventHandler<T> {

    private static final Logger logger = LoggerFactory.getLogger ( AbstractDAProcedureMenuReceivedHandler.class);
7
задан Kent Fredric 22 November 2008 в 08:01
поделиться

5 ответов

_wmainCRTStartup является функцией, которая называет wmain ()

IIRC это должно быть доступно в некотором.o файле, с которым можно связаться, посмотрите в каталоге lib.

Возможно, это - полезное чтение также: Уменьшите EXE и Размер DLL с LIBCTINY.LIB (и скалы Matt Pietrek :-)

4
ответ дан 6 December 2019 в 23:15
поделиться

Ну, отвечая мне здесь, таким образом, в случае, если кто-то еще находит эту страницу, ища информацию.

Как рекомендуемый MSalters, код cookie безопасности может быть украден от источника CRT, но выполнение этого я нашел что /GS- флаг компилятора может использоваться для предотвращения материала безопасности в целом.

Как SoapBox заявил, API-функции должны быть __stdcall, а также точка входа делает. Я устранил проблему точки входа с флагом командной строки компоновщика /entry:wmain.

И наконец, как Tomek указал, API-функции должны быть в экстерне C!

Так:

#pragma comment(lib, "kernel32.lib")

typedef int(*FARPROC)();

extern "C" {
  void* __stdcall LoadLibraryW( wchar_t* lpLibFileName );
  FARPROC __stdcall GetProcAddress( void* hModule, char* lpProcName );
  int __stdcall FreeLibrary( void* hLibModule );
  typedef int (__stdcall *f_MessageBoxW_t)( unsigned long hWnd, wchar_t* lpText, wchar_t* lpCaption, unsigned long uType);
  f_MessageBoxW_t fnMsg;
  void* hUser;
};

int __stdcall wmain(int argc, wchar_t* argv[])
{
  hUser = LoadLibraryW( L"user32.dll" );
  fnMsg = (f_MessageBoxW_t)GetProcAddress( hUser, "MessageBoxW" );
  fnMsg( 0, L"foo", L"bar", 0 );
  FreeLibrary( hUser );
  return 0;
}
3
ответ дан 6 December 2019 в 23:15
поделиться

Можно посмотреть в Windows.h для наблюдения прототипов, в которых Вы нуждаетесь для своего импорта kernel32. В целом функции окон определяются WINAPI который является на самом деле __stdcall и нет __cdecl. Это решит ту проблему, по крайней мере.

Что касается Вашей другой проблемы, необходимо исследовать параметры командной строки компоновщика и видеть, существует ли способ заставить ее не искать вещи от CRT. Я не знаю, существует ли способ сделать это или нет. Но Вы оказываетесь перед необходимостью находить путь или определять те функции Ваш сам (который Вы, вероятно, не хотите делать).

Я рекомендовал бы просто использовать другой компилятор/компоновщика.

1
ответ дан 6 December 2019 в 23:15
поделиться

Надлежащая точка входа main(), нет wmain() (так как Вы компилируете консольное приложение). Код cookie безопасности может быть украден из исходного кода CRT; никакая потребность связать его в.

0
ответ дан 6 December 2019 в 23:15
поделиться

Необходимо объявить функции windows.h как экстерн "C".

1
ответ дан 6 December 2019 в 23:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: