如何在没有windows.h宏的情况下声明OutputDebugStringA?

时间:2015-06-09 18:58:47

标签: c++ winapi

你知道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 ...

为什么?

2 个答案:

答案 0 :(得分:2)

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

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

修复是使用extern "C"作为函数的限定符,这样C ++就不会破坏函数名。

但是,我推荐用于Windows开发,即不包括windows.h头文件。通过包含windows.h头文件可以避免此类问题。

答案 1 :(得分:0)

以下是诀窍:

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