我试图testing如果标准库(kernel32.dll)有一个function。
testing代码片段:
extern voID CreateProcessA (voID); int main (voID) { CreateProcessA (); return 0; }
代码编译和链接如下:
cl /c test.c link test.obj kernel32.lib
这个代码可以用Visual C ++编译,但不能链接:
在c ++中使用dll函数?
使用不同编译器版本的C ++ DLL
为什么extern“C”在下面的情况下仍然不能删除名字
为什么GetProcAddress不起作用?
test.obj : error LNK2019: unresolved external symbol _CreateProcessA referenced in function _main
但是函数CreateProcessA确实存在于kernel32.dll中,你没有?
如何正确链接?
PS我不想运行这个代码,只是检查该函数存在(如果代码编译和链接 – function存在)。
要查看功能是否存在,请使用
dumpbin /exports kernel32.dll | findstr CreateProcess
你甚至没有使用正确的原型,所以链接器当然找不到正确的功能。 命名约定是完全关闭的,CreateProcess实际上是一个宏(根据UNICODE扩展到CreateProcessA或W )。
(你不需要明确地链接到kernel32.lib ,因为cl.exe默认已经完成了)
不要自己声明原型, #include <windows.h> 。
coreel32.dll导出函数为“CreateProcessA”,请注意缺少的前导下划线。 说服连接器使用该导出的唯一方法是链接kernel32.lib,一个由windows SDK提供的导入库。
然后你会遇到下一个问题,导入库声明导出为_CreateProcess@40 。 这是__stdcall调用约定所应用的名称装饰。 这个调用约定是明确的设计来捕捉你的错误,你没有正确地声明函数。 名称的@ 40部分表示堆栈帧中传递参数所需的字节数。
所以,为了使它工作,您应该#include <windows.h>来获得正确的函数声明,并链接到kernel32.lib以获得正确的导出名称。
现在你正在声明你自己的CreateProcess()版本。 由于您没有提供正文(代码),链接器不知道在哪里查找要执行的函数。
为了从kernel32.lib调用CreateProcess,你需要包含正确的头文件
#include <windows.h>
如果编译器不知道windows.h然后可能平台SDK for windows安装不正确。
您还需要链接到正确的lib
#pragma comment(lib,"kernel32.lib")
你还应该阅读关于createprocess的文档,因为它需要大量的参数
BOol WINAPI CreateProcess( __in_opt LPCTSTR lpApplicationname,__inout_opt LPTSTR lpCommandline,__in_opt LPSecurity_ATTRIBUTES lpProcessAttributes,__in_opt LPSecurity_ATTRIBUTES lpThreadAttributes,__in BOol binheritHandles,__in DWORD DWCreationFlags,__in_opt LPVOID lpEnvironment,__in_opt LPCTSTR lpCurrentDirectory,__in LPSTARTUPINFO lpStartupInfo,__out LPPROCESS_informatION lpProcessinformation );
你应该搜索整个interwebs的CreateProcess例子,也许考虑切换到C ++,因为你在windows上
对于初学者来说,把一个适当的头文件放在原型<windows.h> ,因为这是一个windows源代码,请为你的链接器添加kernel32.lib ,删除原型,因为它是不正确的。 你的main功能在你是创建一个命令行程序还是一个windows程序方面是有争议的 – 如果是后者,应该是“ WinMain ”。
如果您在MSDN中查看函数“ CreateProcess ”,向下滚动,您将看到“library”,这是提示您需要链接哪个库才能正常工作的提示。
希望这有助于,最好的问候,汤姆。
我认为这是一个坏主意,但如果你想这样做,你需要链接到kernel32.lib导出库。
你必须包含windows.h才能得到正确的原型:
#include <windows.h> int main (voID) { CreateProcess(); // will cause warning due to incorrect parameter List return 0; }
有没有特别的原因,你不想包含windows.h ?
使用MinGW可以使用“-mwindows”标志。 例:
gcc.exe -c -g -MMD -MP -MF build/DeBUG/MinGW-windows/newmain.od -o build/DeBUG/MinGW-windows/newmain.o newmain.c gcc.exe -o dist/DeBUG/MinGW-windows/hwprint_dll build/DeBUG/MinGW-windows/newmain.o -mwindows
这将包括像gdi32.a,kernel32.a,user32.a和ws2_32.a的东西。
总结以上是内存溢出为你收集整理的链接错误的Windowsfunction全部内容,希望文章能够帮你解决链接错误的Windowsfunction所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)