链接错误的Windowsfunction

链接错误的Windowsfunction,第1张

概述链接错误的Windowsfunction

我试图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所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1294310.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-10
下一篇 2022-06-10

发表评论

登录后才能评论

评论列表(0条)

保存