PJLMon不会建造(LNK 2019)

时间:2012-07-18 16:18:10

标签: 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,而且我没有使用预编译的标头。

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

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

我有点迷失在哪里离开这里。任何建议将不胜感激!

2 个答案:

答案 0 :(得分:1)

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

如果你想修复错误,你要么摆脱#undef线(就像你的回答一样)或手动调用正确的函数,因为你知道是否需要调用ANSI或Wide版本,具体取决于是否使用Unicode字符串。

答案 1 :(得分:0)

通过删除行

似乎解决了这个问题
#undef SetPort

并将其替换为

#include <WinSpool.h>

为什么这样有效,我不知道。但它的确有效。 :) 如果您知道原因,请随时解释。