c - PULMon 无法构建 (LNK2019)

标签 c dll printing linker linker-errors

编辑:我似乎已经解决了这个问题,即使我不知道它为什么起作用的细节。请参阅本文下方的答案。

我正在尝试编译示例语言监视器 PJLMon,但链接器错误阻止代码成功构建。我会发布整个代码,但它有点多(其中大部分可能与手头的问题无关),并且很容易在网上找到。

有问题的错误是:“1>pjlmon.obj:错误 LNK2019:函数 _ClearPrinterStatusAndIniJobs 中引用的未解析外部符号 _SetPort”

问题代码引用了pjlmon.c中的代码,如下所示:

VOID
ClearPrinterStatusAndIniJobs(
    __in    PINIPORT    pIniPort
    )
{
    PORT_INFO_3 PortInfo3;

    if ( pIniPort->PrinterStatus ||
         (pIniPort->status & PP_PRINTER_OFFLINE) ) {

        pIniPort->PrinterStatus = 0;
        pIniPort->status &= ~PP_PRINTER_OFFLINE;

        ZeroMemory(&PortInfo3, sizeof(PortInfo3));
        SetPort(NULL, pIniPort->pszPortName, 3, (LPBYTE)&PortInfo3); // LNK2019 HERE
    }

    SendJobLastPageEjected(pIniPort, ALL_JOBS, FALSE);
}

我没有以任何方式修改程序逻辑。我已经修改了一些可以在本地找到的头文件(即 #include "winsplp.h"而不是 ),但是这些文件在其他方面没有改变,所以我认为这不是问题。不过,我会继续展示我的定义和包含,以防我犯了一个愚蠢的错误:

#define USECOMM

#include "precomp.h"
#include "ntddpar.h"

#include <windows.h>
#undef SetPort

#include <WinReg.h>
#include <winioctl.h>

我关闭了 CLR,并且没有使用预编译 header 。

在 Project->Properties->Linker->Input->Additional Dependencies 下,我添加了“winspool.lib;advAPI32.lib”。这些文件应包含对 winspool.h(自动包含在 windows.h 中)和 winreg.h 中函数的引用。

#undef SetPort 代码删除了一个宏,该宏设置为将“SetPort”更改为“SetPortW”(unicode)或“SetPortA”(ascii)。我认为这不是问题。

我有点不知道从这里去哪里。任何建议将不胜感激!

最佳答案

SetPort() 在 Windows 库中不作为函数存在。对于 ANSI(真正的多字节)字符串,您可以使用 SetPortA(),对于宽 (Unicode) 字符串,您可以使用 SetPortW()。通过使用 #undef SetPort,您可以防止预处理器将调用替换为对 A 或 W 的正确变体的调用,这是基于 UNICODE 处理器符号完成的。

如果你想修复错误,你要么去掉 #undef 行(正如你在回答中所做的那样),要么手动调用正确的函数,因为你会知道你是否需要调用 ANSI 或 Wide 版本,具体取决于无论您是否使用 Unicode 字符串。

关于c - PULMon 无法构建 (LNK2019),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11545886/

相关文章:

.net - 使用子文件夹中的程序集

c++ - 捕获dll异常后访问冲突

C++ DLL 注入(inject) : path with special characters

c++ - 转义双引号和网络

c - 许多条件,减少代码大小

c - C 中的段错误?

java - BufferedReader 不读取最后一行

python - 如何在 Python 中使用 x DP 将分数写为十进制?

android - 如何从Android应用程序中获取打印输出?

c - Win32 C++ ListView HDN_BEGINTRACK 不起作用