Issue:
I have placed the ePrintCom class in a Windows Service Application. With a OEM_NORMAL printer installed, I connect to it in the service using set_EnableSaveStatusEvent(PRINTER_NAME, true) and handle the event. I also do this for the JobInfo event. In the events I write to a log file indicating which event was fired. I also write to the log file when the service first starts to ensure there is not a security permission preventing me from writing to the log file. I next print a test page from the OEM_NORMAL printer driver. Nothing new is written to the log file indicating that the JobInfoEvent or the SaveStatusEvent were fired. When running the application as a Windows Form application it works great.
Resolution: The application where you are printing from and the service must be loaded under the same identity. Because we have a singleton COM server if they are loaded in different identities you will have two COM objects loaded, one for the application and one for the service. Each one will be standalone and can not communicate with the other. To fix this issue you need to do the following:
1 – Browse to Administrative Tools | Component Services and access Computers | My Computer | DCOM Config | LPCMG. Use the Properties page and the Identity tab to set the identity to the interactive user. It is best to create a user specifically for your service.When you do this only one instance of our singleton com object will be created.
2 - The other part is a security issue. To solve this:
a. Click Start, click Run, type DCOMCNFG, and then click OK.
b. In the Component Services dialog box, expand Component Services, expand Computers, and then right-click My Computer and click Properties.
c. In the My Computer Properties dialog box, click the Default Properties tab.
d. Set Default Authentication to None.
Since this is a service and will probably reside on a server, you may not want to disable the security for COM on the entire machine. Here is an excerpt from MSDN about what we have asked you to modify.
*******
Setting Machine-Wide Default Authentication Level
The authentication level is used to tell COM at what level you want the client to be authenticated. These levels offer various levels of protection, from no protection to full encryption. To enable security for a machine, you need to choose an authentication level other than None.
http://msdn.microsoft.com/en-us/library/ms690141(VS.85).aspx
*******
If this is not an option for you, you can also change the security setting for a specific user using CoInitializeSecurity. You can find more information about this function here:
http://msdn.microsoft.com/en-us/library/ms693736(VS.85).aspx
Travis Montgomery
Senior Sales Engineer