3

無効なローカル プリンター ポートに割り当てられている仮想プリンター (サード パーティが提供) があります。プリンターは常にローカルです (リモート プリント サーバーなどは扱っていません)。新しいローカル ポート (アプリケーション固有) を作成し、プリンター ドライバー インストーラーが選択するランダムな (そしてしばしば間違った) ポートではなく、そのポートにプリンターが割り当てられるように構成したいと考えています。

これを行うにはXcvDataおよび/またはXcvDataPort関数を使用する必要があると思いますが、その方法については少し迷っています。

続行する方法についての例や指針はありますか?

私は次のことをする必要があると思います:

  1. ポート名がまだ存在していないことを確認します (これにはおそらくEnumPortsを使用できますが、ポートも作成する必要があるため、それが最善の方法かどうかはわかりません)。
  2. ポート名が存在する場合は作成します
  3. 新しいポートを使用するようにプリンター構成を変更します

アンインストールの場合:

  1. ポートを取り外します
4

2 に答える 2

2

うわー、それはみんなを困惑させたように見えます...多くの掘り下げた後、これを行う方法は次のとおりです。

DWORD CreatePort(LPWSTR portName)
{
      HANDLE hPrinter;
      PRINTER_DEFAULTS PrinterDefaults;
      memset(&PrinterDefaults, 0, sizeof(PrinterDefaults));

      PrinterDefaults.pDatatype = NULL;
      PrinterDefaults.pDevMode = NULL;
      PrinterDefaults.DesiredAccess = SERVER_ACCESS_ADMINISTER;

      DWORD needed;
      DWORD rslt;


      if (!OpenPrinter(",XcvMonitor Local Port", &hPrinter, &PrinterDefaults))
          return -1;

      DWORD xcvresult= 0;
      if (!XcvData(hPrinter, L"AddPort", (BYTE *)portName, (lstrlenW(portName) + 1)*2, NULL, 0, &needed, &xcvresult))
            rslt= GetLastError();

      if (!ClosePrinter(hPrinter))
          rslt= GetLastError();

      return rslt;
}

特定のプリンターのポートを設定するのは比較的簡単です - OpenPrinter()、GetPrinter() with PRINTER_INFO_2、SetPrinter()、ClosePrinter()

チェリオ。

于 2009-08-26T00:39:42.623 に答える
0

あなたのコードは偶然に機能しただけだと思います。https://docs.microsoft.com/en-us/windows-hardware/drivers/print/tcpmon-xcv-commands (および私自身の経験) によると 、実際の解決策は次のとおりです。

PORT_DATA_1 pdPortData;  
wcscpy_s(pdPortData.sztPortName, MAX_PORTNAME_LEN, lpPortName);  
[...]
if (!XcvData(hXcv, L"AddPort", (BYTE*) &pdPortData, sizeof(PORT_DATA_1), NULL, 0, &dwNeeded, &dwStatus))
[...]

たまたま、sztPortName は PORT_DATA_1 構造体の最初の要素です。間違っているのに、コードが失敗しなかったのはそのためかもしれません。

于 2018-06-20T20:03:22.597 に答える