1

Windows Server 2012 R2 に固有のもので、以下の方法を使用して PCL ファイルが印刷されないようにするものはありますか?

オンラインで見つけたコードを使用して、以下の URL から dll ファイルを生成しました (少し下にスクロールして、Abel が投稿した回答を確認してください)。 c#でpclファイルを印刷するには?

生成されたライブラリ ファイルを使用し、次のコードを使用してファイルを印刷しました。

string fileName = definedPath + randomFileName.pcl
if(File.Exists(fileName))
{
    //PrintRaw is the name I gave to the dll file I generated 
    PrintRaw.RawFilePrint.SendFileToPrinter(installedPrinterName, fileName);
}

このコード セグメントは、通常の Windows OS では pcl ファイルを出力しますが、Windows Server 2012 R2 で試したところ、出力されませんでした。

C:\Windows\System32\spool\PRINTERS をチェックするまで印刷ジョブを追跡しましたが、印刷ジョブが消える前に短時間表示されます。しかし、マシンが大幅に減速したことを除いて、その後は何も起こりませんでした。

ここに役立つかもしれないものがあります。1.「別のプロセスで使用されている」ため、同じファイルをコードで再度印刷することはできません 2.すべてのプリンターがインストールされ、正しい名前を使用しています(名前を文字通りコピーして貼り付けます) Windows 7、8.1、および 10 のプリント サーバーとローカルにインストールされたプリンター。

助けてください!

4

1 に答える 1

0

Server 2012 では、XPS ドキュメントのみの raw 印刷をサポートするバージョン 4 ドライバーをプリンターが使用していることが最も可能性の高い説明です。

次のコードで v4 ドライバーを検出できます。

bool IsV4Driver(wchar_t* printerName)
{
    HANDLE handle;
    PRINTER_DEFAULTS defaults;

    defaults.DesiredAccess = PRINTER_ACCESS_USE;
    defaults.pDatatype = L"RAW";
    defaults.pDevMode = NULL;

    if (::OpenPrinter(printerName, &handle, &defaults) == 0)
    {
        return false;
    }

    DWORD version = GetVersion(handle);

    ::ClosePrinter(handle);

    return version == 4;
}

DWORD GetVersion(HANDLE handle)
{
    DWORD needed;

    ::GetPrinterDriver(handle, NULL, 2, NULL, 0, &needed);
    if (::GetLastError() != ERROR_INSUFFICIENT_BUFFER)
    {
        return -1;
    }

    std::vector<char> buffer(needed);
    if (::GetPrinterDriver(handle, NULL, 2, (LPBYTE) &buffer[0], needed, &needed) == 0)
    {
        return -1;
    }

    return ((DRIVER_INFO_2*) &buffer[0])->cVersion;
}

v4 ドライバーの場合は、このMSDN の例XPS_PASSに示すように、データ型を使用して XPS ドライバー チェーンをバイパスし、ファイルをプリンターに直接送信する必要があります。

于 2016-02-04T21:22:49.433 に答える