2010-11-23 30 views
1

プリンタポ​​ートの情報を取得する際に問題があります。私はすでに、追加設定し、ポートを削除するXcvData機能を使用しますが、私はそれを期待どおりに実行するには、次のことができません。PrinterNativeMethodsからポート情報の読み取りに関する問題

public PrinterNativeMethods.PORT_DATA_1 GetPortData1FromPort(string serverName, string portName) 
{ 
    IntPtr printerHandle; 
    PrinterNativeMethods.PRINTER_DEFAULTS defaults = new PrinterNativeMethods.PRINTER_DEFAULTS 
    { 
     DesiredAccess = PrinterNativeMethods.PrinterAccess.ServerAdmin 
    }; 

    string connection = string.Format(@"{0},XcvPort {1}", serverName, portName); 

    PrinterNativeMethods.OpenPrinter(connection, out printerHandle, ref defaults); 

    PrinterNativeMethods.CONFIG_INFO_DATA_1 configData = new PrinterNativeMethods.CONFIG_INFO_DATA_1 
    { 
     dwVersion = 1, 
    }; 

    uint size = (uint)Marshal.SizeOf(configData); 

    IntPtr pointer = Marshal.AllocHGlobal((int)size); 
    Marshal.StructureToPtr(configData, pointer, true); 

    PrinterNativeMethods.PORT_DATA_1 portData = new PrinterNativeMethods.PORT_DATA_1(); 
    uint portDataSize = (uint)Marshal.SizeOf(portData); 
    IntPtr portDataHandle = Marshal.AllocHGlobal((int)portDataSize); 

    try 
    { 
     uint outputNeeded; 
     uint status; 

     var retVal = PrinterNativeMethods.XcvData(printerHandle, "GetConfigInfo", pointer, size, out portDataHandle, portDataSize, out outputNeeded, out status); 
     //portDataHandle now points to a different location!? Unmarshalling will fail: 
     portData = (PrinterNativeMethods.PORT_DATA_1)Marshal.PtrToStructure(portDataHandle, typeof(PrinterNativeMethods.PORT_DATA_1)); 

    } 
    finally 
    { 
     PrinterNativeMethods.ClosePrinter(printerHandle); 
     Marshal.FreeHGlobal(pointer); 
     Marshal.FreeHGlobal(portDataHandle); 
    } 

    return portData; 
} 

を:

[DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Unicode)] 
    internal static extern int XcvData(
     IntPtr handle, 
     string dataName, 
     IntPtr inputData, 
     uint inputDataSize, 
     out IntPtr outputData, 
     uint outputDataSize, 
     out uint outputNeededSize, 
     out uint status); 

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Unicode)] 
    public struct PORT_DATA_1 
    { 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 64)] 
     public string sztPortName; 

     public uint dwVersion; 

     public uint dwProtocol; 

     public uint cbSize; 

     public uint dwReserved; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 49)] 
     public string sztHostAddress; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33h)] 
     public string sztSNMPCommunity; 

     public uint dwDoubleSpool; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 33)] 
     public string sztQueue; 

     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)] 
     public string sztIPAddress; 

     [MarshalAs(UnmanagedType.ByValArray, SizeConst = 540)] 
     public byte[] Reserved; 

     public uint dwPortNumber; 

     public uint dwSNMPEnabled; 

     public uint dwSNMPDevIndex; 
    } 

追加コメント:私はできません代わりにWMIまたはprnadmin.dllを使用してください。

+1

"私が期待通りに実行"を定義してください。例外がスローされますか?実際に何が起こるのですか?正確にコードがあなたが期待していることをしていないのですか? – Polyfun

+0

私はそれが動作することを期待します;-)、私は、var retVal = PrinterNativeMethods.XcvData(...)以下の呼び出しでAccessViolationExceptionを取得します。私は、IntPtr portDataHandleがXcvDataの呼び出しの後に異なる値を持つことに気付きました。 – SomeCallMeTim

答えて

0

問題は、XcvData定義の定義にあります。 MSのdefinitionのoutputDataパラメータは、単にデータを書き込むポインタを指定するだけです。IntPtrはポインタですが、パラメータをに設定してIntPtrをポインタへのポインタにしているため、パラメータが変更されているように見えます。署名を以下に変更すると、問題が解決されます。

ビット単位で変更することで、不要な割り当てや割り当て解除を回避することもできます。

あなたは上のエントリポイントプロパティを設定することで、わずかに異なるシグネチャでそれに複数の参照を行うことができますちょうどこの回の呼び出しより多くのためXcvDataを使用すると仮定すると
[DllImport("winspool.drv", SetLastError = true, CharSet = CharSet.Unicode)] 
internal static extern int XcvData(
    IntPtr handle, 
    string dataName, 
    IntPtr inputData, 
    uint inputDataSize, 
    ref PORT_DATA_1 outputData, 
    uint outputDataSize, 
    out uint outputNeededSize, 
    out uint status); 

にXcvDataのためのあなたのメソッドのシグネチャを変更

DllImport属性。

これは私のマシンで簡単にテストし、問題が解決することを確認できます。

関連する問題