我如何声明OutputDebugStringA没有窗口.h宏

How do I declare OutputDebugStringA without windows.h macros?

本文关键字:窗口 OutputDebugStringA 何声明 声明      更新时间:2023-10-16

你知道Python有from urllib import *,但也提供from urllib import request,所以你可以只导入一个符号?不幸的是,C/c++不提供,但这就是我想在这里做的:from windows.h import OutputDebugStringA,因为我所需要的只是一个函数。这是一个个人项目。

我使用cl.exe main.cpp /EP进行预处理,它告诉我这应该工作

typedef char CHAR;
typedef  const CHAR *LPCSTR, *PCSTR;
__declspec(dllimport)
void
__stdcall
OutputDebugStringA(
     LPCSTR lpOutputString
    );

但我仍然得到一个链接错误:main.obj : error LNK2019: unresolved external symbol "__declspec(dllimport) void __cdecl OutputDebugStringA(char const *)" (__imp_?OutputDebugStringA@@YAXPEBD@Z) referenced in ...

为什么?

问题是Windows API是基于C的,因此要调用的函数是C函数,而不是c++函数。

在c++编译器下编译时的问题是函数名称被打乱(由于c++使用函数重载)。因此,函数名最终与导入库中定义的实际函数名不同(在本例中为kernel32.lib)。因此,您将得到无法找到该函数的链接器错误。

修复方法是使用extern "C"作为函数的限定符,这样c++就不会混淆函数名。

然而,我不建议在Windows开发中这样做,即不包括windows.h头文件。这样的问题可以通过包含windows.h头文件来避免。

下面的代码就可以了:

extern "C" __declspec(dllimport) void __stdcall OutputDebugStringA(const char* lpOutputString);