1

編集:なぜそれが機能したのかの詳細がわからなくても、問題を解決したようです。この投稿の下の回答を参照してください。

サンプル言語モニター PJLMon をコンパイルしようとしていますが、リンカ エラーによりコードが正常にビルドされません。コード全体を投稿したいと思いますが、それは少し長く (ほとんどの場合、目前の質問とは無関係である可能性があります)、オンラインで簡単に見つけることができます。

問題のエラーは次のとおりです。

問題のコードは、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->Properties->Linker->Input->Additional Dependencies の下に、「winspool.lib; advAPI32.lib」を追加しました。これらのファイルには、winspool.h (windows.h に自動的に含まれる) および winreg.h 内の関数への参照が含まれている必要があります。

#undef SetPort コードは、"SetPort" を "SetPortW" (Unicode) または "SetPortA" (ASCII) に変更するように設定されたマクロを削除します。これは問題ではないと思います。

ここからどこへ行けばいいのか少し迷っています。どんな提案でも大歓迎です!

4

2 に答える 2

1

SetPort() は、Windows ライブラリに関数として存在しません。ANSI (実際にはマルチバイト) 文字列には SetPortA() を、ワイド (Unicode) 文字列には SetPortW() を使用できます。を使用#undef SetPortすることで、プリプロセッサがその呼び出しを A または W の正しいバリアントへの呼び出しに置き換えることを防ぎます。これは、UNICODE プロプロセッサ シンボルに基づいて行われます。

エラーを修正したい場合は、 #undef 行を取り除くか (回答から行ったように)、正しい関数を手動で呼び出します。これは、ANSI バージョンと Wide バージョンのどちらを呼び出す必要があるかがわかるからです。 Unicode 文字列を扱うかどうか。

于 2012-07-18T16:30:07.587 に答える
0

行を削除することで問題が解決したようです

#undef SetPort

そしてそれを

#include <WinSpool.h>

なぜこれが機能するのか、私にはわかりません。しかし、それは機能します。:) 理由がわかっている場合は、お気軽に説明してください。

于 2012-07-18T16:29:37.673 に答える