我试图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对象
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] 举报,一经查实,本站将立刻删除。