微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

build立控制台应用程序没有CRT&默认标题?

我试图build立一个控制台应用程序,而不使用CRT,或在任何情况下比kernel32.lib任何其他import。 我得到我的代码进行编译,但不能包装链接器几个问题:

unresolved external symbol @__security_check_cookie@4 unresolved external symbol "int __cdecl FreeLibrary(void *)" (?FreeLibrary@@YAHpax@Z) unresolved external symbol "void * __cdecl LoadLibraryW(wchar_t *)" (?LoadLibraryW@@YApaxPA_W@Z) unresolved external symbol "int (__cdecl*__cdecl GetProcAddress(void *,char *))(void)" (?GetProcAddress@@YAP6AHXZpaxPAD@Z) unresolved external symbol _wmainCRTStartup

FreeLibrary,LoadLibraryW和GetProcAddress我已经明确带入了程序,不使用windows.h:

#pragma comment(lib,"kernel32.lib") typedef int(*FARPROC)(); void* LoadLibraryW( wchar_t* lpLibFileName ); FARPROC GetProcAddress( void* hModule,char* lpProcName ); int FreeLibrary( void* hlibmodule );

我想我的原型有些问题。 然而,更大的问题是__security_check_cookie和_wmainCRTStartup ,这显然与CRT有关。 所以我想知道如何去重写入口点的认int wmain(int argc,wchar_t* argv[]) ,以及如何摆脱任何安全cookie。

java getRuntime()。exec一个需要UAC的exe

通过打破purevirt.cdebuggingR6025纯虚函数调用

程序启动之前的断言失败

在WinApi中如何发送variables到属于另一个进程/线程的对话框

为什么我的visual studio 2k8 C ++项目不能使用unicode字符?

WM_MENUSELECT不在CFrameWndEx窗口中处理

通过检查registry来确定是否安装了IIS

fstream >> int失败?

LNK2019:无法parsing的外部符号_main在函数___tmainCRTStartup中引用

在非MFC应用程序上使用activeX对象

_wmainCRTStartup是调用wmain()的函数

IIRC它应该可以在一些你可以链接的.o文件,看你的lib目录。

也许这是有用的阅读: 减少EXE和DLL大小与LIBCTINY.LIB (和马特Pietrek岩石:-)

那么,回答自己在这里总结,以防别人发现这个网页寻找信息。

正如MSalters所建议的那样,安全cookie代码可以从CRT源中被窃取,但是这样做我发现/GS-编译器标志可以用来完全避免安全问题。

SoapBox说,API函数需要__stdcall ,以及入口点。 我使用链接器命令行标志/entry:wmain修复了入口点问题。

最后,正如Tomek指出的那样,API函数必须在extern C中!

所以:

#pragma comment(lib,"kernel32.lib") typedef int(*FARPROC)(); extern "C" { void* __stdcall LoadLibraryW( wchar_t* lpLibFileName ); FARPROC __stdcall GetProcAddress( void* hmodulee,char* lpProcName ); int __stdcall FreeLibrary( void* hlibmodulee ); 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; }

更正确的入口点声明将是:

int __stdcall wmain(PVOID ThreadParam)

没有直接由BaseThreadInitThunk调用的CRT入口点。 它传递指向某个东西的指针,但不是argc + argv。

您可以在Windows.h中查看您的kernel32导入所需的原型。 一般来说,windows函数定义了WINAPI ,它实际上是__stdcall而不是__cdecl 。 至少可以解决这个问题。

至于你的其他问题,你需要探索链接器的命令行参数,看看是否有办法让它不从CRT中寻找东西。 我不知道是否有办法做到这一点。 但是,你将不得不找到一种方法或定义你自己的功能(你可能不想这么做)。

我建议只使用不同的编译器/链接器。

你需要声明windows.h函数为extern“C”。

正确的入口点是main() ,而不是wmain() (因为你正在编译一个控制台应用程序)。 安全Cookie代码可以从CRT源代码删除; 无需链接

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐