Ну, отвечая себе здесь, чтобы подвести итог, на случай, если кто-то найдет эту страницу в поисках информации.
Как советовал MSalters, код cookie безопасности может быть украден из источника CRT, но, сделав это, я обнаружил, что флаг компилятора /GS-
можно использовать, чтобы вообще избежать мер безопасности.
Как сказал SoapBox, функции API должны быть __stdcall
, как и точка входа.
Я исправил проблему точки входа с флагом командной строки компоновщика /entry:wmain
.
И, наконец, как указал Томек, функции 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;
}