Enumerating Printer Drivers Help Please

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Brett Mostert

    Enumerating Printer Drivers Help Please

    Hi,

    I need to be able to Enumerate through Printer Drivers, ports, printers
    and so fourth. And even add printers, ports, and drivers and setup printers.

    Sofar i can do all of the following except anything to do with drivers.

    I have added a reference to the PRNADMIN.DLL from MS Windows 2003 Tool
    Kit into my project to do all of the above, but when i try to enumerate
    printers i received the following error....

    The data area passed to a system call is too small.
    System.Runtime. InteropServices .ComException (0x8007007A)

    Any help please? My code is below. (Basically the same for enumerating
    ports - at least that works, even the VB6.0 code given my MS in the
    examples throughs the same error)

    using PRNADMINLib;

    public static bool AddPrinterDrive r(string strServerName)
    {
    try
    {
    strServerName = "";
    PrintMasterClas s oPrinterMaster = new PrintMasterClas s();
    object oRefDriver = strServerName;
    object oDrivers;
    oDrivers = oPrinterMaster. get_Drivers(ref oRefDriver);
    DriverCollectio n oDriverCollecti on = (DriverCollecti on)oDrivers;

    foreach (Driver oDriver in oDriverCollecti on)
    {
    System.Windows. Forms.MessageBo x.Show(oDriver. MonitorName);
    System.Windows. Forms.MessageBo x.Show(oDriver. ConfigFile);
    System.Windows. Forms.MessageBo x.Show(oDriver. DataFile);
    System.Windows. Forms.MessageBo x.Show(oDriver. DriverVersion);
    System.Windows. Forms.MessageBo x.Show(oDriver. DriverArchitect ure);
    System.Windows. Forms.MessageBo x.Show(oDriver. Environment);
    System.Windows. Forms.MessageBo x.Show(oDriver. HelpFile);
    System.Windows. Forms.MessageBo x.Show(oDriver. InfFile);
    System.Windows. Forms.MessageBo x.Show(oDriver. ModelName);
    System.Windows. Forms.MessageBo x.Show(oDriver. Path);
    System.Windows. Forms.MessageBo x.Show(oDriver. ServerName);
    System.Windows. Forms.MessageBo x.Show(oDriver. Version.ToStrin g());
    }
    return true;
    }
    catch (Exception err)
    {
    System.Windows. Forms.MessageBo x.Show(err.Mess age.ToString() + " | " +
    err.ToString() + "|" + err.Source.ToSt ring());
    return false;
    }
    }
  • Willy Denoyette [MVP]

    #2
    Re: Enumerating Printer Drivers Help Please


    "Brett Mostert" <brettmostert@s ebrio.com> wrote in message
    news:OvWZ2AHYFH A.3212@TK2MSFTN GP10.phx.gbl...[color=blue]
    > Hi,
    >
    > I need to be able to Enumerate through Printer Drivers, ports, printers
    > and so fourth. And even add printers, ports, and drivers and setup
    > printers.
    >
    > Sofar i can do all of the following except anything to do with drivers.
    >
    > I have added a reference to the PRNADMIN.DLL from MS Windows 2003 Tool Kit
    > into my project to do all of the above, but when i try to enumerate
    > printers i received the following error....
    >
    > The data area passed to a system call is too small.
    > System.Runtime. InteropServices .ComException (0x8007007A)
    >
    > Any help please? My code is below. (Basically the same for enumerating
    > ports - at least that works, even the VB6.0 code given my MS in the
    > examples throughs the same error)
    >
    > using PRNADMINLib;
    >
    > public static bool AddPrinterDrive r(string strServerName)
    > {
    > try
    > {
    > strServerName = "";
    > PrintMasterClas s oPrinterMaster = new PrintMasterClas s();
    > object oRefDriver = strServerName;
    > object oDrivers;
    > oDrivers = oPrinterMaster. get_Drivers(ref oRefDriver);
    > DriverCollectio n oDriverCollecti on = (DriverCollecti on)oDrivers;
    >
    > foreach (Driver oDriver in oDriverCollecti on)
    > {
    > System.Windows. Forms.MessageBo x.Show(oDriver. MonitorName);
    > System.Windows. Forms.MessageBo x.Show(oDriver. ConfigFile);
    > System.Windows. Forms.MessageBo x.Show(oDriver. DataFile);
    > System.Windows. Forms.MessageBo x.Show(oDriver. DriverVersion);
    > System.Windows. Forms.MessageBo x.Show(oDriver. DriverArchitect ure);
    > System.Windows. Forms.MessageBo x.Show(oDriver. Environment);
    > System.Windows. Forms.MessageBo x.Show(oDriver. HelpFile);
    > System.Windows. Forms.MessageBo x.Show(oDriver. InfFile);
    > System.Windows. Forms.MessageBo x.Show(oDriver. ModelName);
    > System.Windows. Forms.MessageBo x.Show(oDriver. Path);
    > System.Windows. Forms.MessageBo x.Show(oDriver. ServerName);
    > System.Windows. Forms.MessageBo x.Show(oDriver. Version.ToStrin g());
    > }
    > return true;
    > }
    > catch (Exception err)
    > {
    > System.Windows. Forms.MessageBo x.Show(err.Mess age.ToString() + " | " +
    > err.ToString() + "|" + err.Source.ToSt ring());
    > return false;
    > }
    > }[/color]

    IMO this COM server (prnadmin.dll) has not been designed(tested ) to be used
    from non-scripting languages (VBS or JS), everything else like VB.NET, C#
    and C++ fails to set/get some properties.
    Unless you need this to run on NT4, I would suggest you to use
    System.Manageme nt and WMI for this.

    Willy.


    Comment

    • Brett Mostert

      #3
      Re: Enumerating Printer Drivers Help Please

      Willy Denoyette [MVP] wrote:[color=blue]
      > "Brett Mostert" <brettmostert@s ebrio.com> wrote in message
      > news:OvWZ2AHYFH A.3212@TK2MSFTN GP10.phx.gbl...
      >[color=green]
      >>Hi,
      >>
      >>I need to be able to Enumerate through Printer Drivers, ports, printers
      >>and so fourth. And even add printers, ports, and drivers and setup
      >>printers.
      >>
      >>Sofar i can do all of the following except anything to do with drivers.
      >>
      >>I have added a reference to the PRNADMIN.DLL from MS Windows 2003 Tool Kit
      >>into my project to do all of the above, but when i try to enumerate
      >>printers i received the following error....
      >>
      >>The data area passed to a system call is too small.
      >>System.Runtim e.InteropServic es.ComException (0x8007007A)
      >>
      >>Any help please? My code is below. (Basically the same for enumerating
      >>ports - at least that works, even the VB6.0 code given my MS in the
      >>examples throughs the same error)
      >>
      >>using PRNADMINLib;
      >>
      >>public static bool AddPrinterDrive r(string strServerName)
      >>{
      >>try
      >>{
      >>strServerNa me = "";
      >>PrintMasterCl ass oPrinterMaster = new PrintMasterClas s();
      >>object oRefDriver = strServerName;
      >>object oDrivers;
      >>oDrivers = oPrinterMaster. get_Drivers(ref oRefDriver);
      >>DriverCollect ion oDriverCollecti on = (DriverCollecti on)oDrivers;
      >>
      >>foreach (Driver oDriver in oDriverCollecti on)
      >>{
      >>System.Window s.Forms.Message Box.Show(oDrive r.MonitorName);
      >>System.Window s.Forms.Message Box.Show(oDrive r.ConfigFile);
      >>System.Window s.Forms.Message Box.Show(oDrive r.DataFile);
      >>System.Window s.Forms.Message Box.Show(oDrive r.DriverVersion );
      >>System.Window s.Forms.Message Box.Show(oDrive r.DriverArchite cture);
      >>System.Window s.Forms.Message Box.Show(oDrive r.Environment);
      >>System.Window s.Forms.Message Box.Show(oDrive r.HelpFile);
      >>System.Window s.Forms.Message Box.Show(oDrive r.InfFile);
      >>System.Window s.Forms.Message Box.Show(oDrive r.ModelName);
      >>System.Window s.Forms.Message Box.Show(oDrive r.Path);
      >>System.Window s.Forms.Message Box.Show(oDrive r.ServerName);
      >>System.Window s.Forms.Message Box.Show(oDrive r.Version.ToStr ing());
      >>}
      >>return true;
      >>}
      >>catch (Exception err)
      >>{
      >>System.Window s.Forms.Message Box.Show(err.Me ssage.ToString( ) + " | " +
      >>err.ToString( ) + "|" + err.Source.ToSt ring());
      >>return false;
      >>}
      >>}[/color]
      >
      >
      > IMO this COM server (prnadmin.dll) has not been designed(tested ) to be used
      > from non-scripting languages (VBS or JS), everything else like VB.NET, C#
      > and C++ fails to set/get some properties.
      > Unless you need this to run on NT4, I would suggest you to use
      > System.Manageme nt and WMI for this.
      >
      > Willy.
      >
      >[/color]
      Hi, first of all thanx for the reply :), but i have tried using VBS
      already, and it throws the same error, even the sample microsoft
      provides in there .vbs file throws the same error?

      Any thoughts?

      Thanx
      Brett

      Comment

      • Willy Denoyette [MVP]

        #4
        Re: Enumerating Printer Drivers Help Please


        "Brett Mostert" <brettmostert@s ebrio.com> wrote in message[color=blue][color=green]
        >>
        >>[/color]
        > Hi, first of all thanx for the reply :), but i have tried using VBS
        > already, and it throws the same error, even the sample microsoft provides
        > in there .vbs file throws the same error?
        >
        > Any thoughts?
        >
        > Thanx
        > Brett[/color]

        This works for me on both W2K3 and XP, using prnadmin.dll version 5.2.3790.0
        ..

        Dim oMaster
        set oMaster = CreateObject("P rintMaster.Prin tMaster.1")
        for each oDriver in oMaster.Drivers ("")
        wscript.echo "DriverName : " & oDriver.ModelNa me
        next

        Using any non-scripting language (C++, C#, VB.NET) to enum the drivers fail
        with HRESULT 0x8007007A, other interfaces like Printer, Port and Form work
        as expected.

        Willy.




        Comment

        • Brett Mostert

          #5
          Re: Enumerating Printer Drivers Help Please

          Willy Denoyette [MVP] wrote:[color=blue]
          > "Brett Mostert" <brettmostert@s ebrio.com> wrote in message
          >[color=green][color=darkred]
          >>>[/color]
          >>Hi, first of all thanx for the reply :), but i have tried using VBS
          >>already, and it throws the same error, even the sample microsoft provides
          >>in there .vbs file throws the same error?
          >>
          >>Any thoughts?
          >>
          >>Thanx
          >>Brett[/color]
          >
          >
          > This works for me on both W2K3 and XP, using prnadmin.dll version 5.2.3790.0
          > .
          >
          > Dim oMaster
          > set oMaster = CreateObject("P rintMaster.Prin tMaster.1")
          > for each oDriver in oMaster.Drivers ("")
          > wscript.echo "DriverName : " & oDriver.ModelNa me
          > next
          >
          > Using any non-scripting language (C++, C#, VB.NET) to enum the drivers fail
          > with HRESULT 0x8007007A, other interfaces like Printer, Port and Form work
          > as expected.
          >
          > Willy.
          >
          >
          >
          >[/color]
          Hey, hmm yes your are right, is there away i could do this using C#?
          I need to be able to add printer ports, drivers, printers and administer
          them?

          thanx
          Brett

          Comment

          Working...