3


1

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

http://msdn.microsoft.com/ja-jp/library/aa506528.aspx[XcvData]またはhttp://msdn.microsoft.com/ja-jp/library/aa506526を使用する必要があると思います。 .aspx [XcvDataPort]はこれを実行するように機能しますが、どうすればよいかというと少し戸惑います。

どのように進めるかについての例またはポインターがありますか?

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

  1. ポート名がまだ存在していないことを確認してください(おそらく EnumPortsを使用できます)。私もポートを作成する必要があることを考えると、それが最善の方法であるかどうかはわかりません。

  2. ポート名が存在する場合は作成します

  3. 新しいポートを使用するようにプリンタ設定を変更します。

そしてアンインストールの場合:

  1. ポートを削除

2 Answer


2


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

DWORD CreatePort(LPWSTR portName){ハンドルhPrinter; PRINTER_DEFAULTS PrinterDefaults; memset(

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

DWORDが必要です。 DWORD rslt;

if(!OpenPrinter( "、XcvMonitorローカルポート"、

DWORD xcvresult = 0。 if(!XcvData(hPrinter、L "AddPort"、(BYTE *)portName、(lstrlenW(portName)1)* 2、NULL、0、

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

rsltを返します。 }

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

チェリオ。


0


PORT_DATA_1 pdPortData。 wcscpy_s(pdPortData.sztPortName、MAX_PORTNAME_LEN、lpPortName);
[...]
if(!XcvData(hXcv、L "AddPort"、(BYTE *)
[...]

偶然にもsztPortNameはPORT_DATA_1構造体の最初の要素です。 多分それはあなたのコードが失敗しなかった理由です、それは間違っていますが。