A Windows XP help forum. PCbanter

If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below.

Go Back   Home » PCbanter forum » Microsoft Windows XP » Printing and Faxing with Windows XP
Site Map Home Register Authors List Search Today's Posts Mark Forums Read Web Partners

x64 AddPrinter error 1003



 
 
Thread Tools Display Modes
  #1  
Old December 6th 07, 07:06 PM posted to microsoft.public.windowsxp.print_fax
Tamas Demjen
external usenet poster
 
Posts: 4
Default x64 AddPrinter error 1003

I'm porting a virtual printer driver from 32-bit to 64-bit, and am
having problems installing it.

My test system is AMD X64 X2 Dual, 1GB RAM, Windows 2003 Server SP1.
Just for the sake of troubleshooting, I've been using the MSPLOT printer
driver that comes with full source code with the Windows 2003 DDK.
Everything I say equally applies to MSPLOT and my own printer driver.

The way I normally install the printer driver on Win32 is using
GetPrinterDriverDirectory, CopyFile, AddPortEx, AddPrinterDriverEx, and
AddPrinter. The AddPrinter call fails on x64 with error 1003 "Cannot
complete this function".

I know that the printer driver is valid, because it happens with MSPLOT,
one of the DDK samples (c:\WINDDK\3790.1830\src\print\msplot\), and
that's x64-compatible. It installs fine manually, using the INF file.
And yes, it's compiled for amd64.

Here's some more specific information of what I'm trying to do:
GetPrinterDriverDirectory(...)
// returns C:\WINDOWS\system32\spool\drivers\x64

CopyFile("driver.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dll", FALSE);
CopyFile("driver.dat",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat", FALSE);
CopyFile("driverui.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll", FALSE);

DRIVER_INFO_3 driverInfo3;
memset(&driverInfo3, 0, sizeof(driverInfo3));
driverInfo3.cVersion = 3;
driverInfo3.pName = "MyPrinterName";
driverInfo3.pEnvironment = "Windows x64";
driverInfo3.pDriverPath =
"C:\\WINDOWS\\system32\spool\\drivers\\x64\\driver .dll";
driverInfo3.pDataFile =
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat";
driverInfo3.pConfigFile =
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll";
driverInfo3.pHelpFile = "";
driverInfo3.pDependentFiles = "\0";
driverInfo3.pMonitorName = NULL;
driverInfo3.pDefaultDataType = "RAW";
AddPrinterDriverEx(NULL, 6, &driverInfo3, APD_COPY_NEW_FILES);
// returns TRUE, GetLastError() 0

PRINTER_INFO_2 pi;
memset(&pi, 0, sizeof(pi));
pi.pServerName = NULL;
pi.pPrinterName = "MyPrinterName";
pi.pShareName = NULL;
pi.pPortName = "My Port:";
pi.pDriverName = "MyPrinterName";
pi.pComment = "";
pi.pLocation = "";
pi.pDevMode.dmDeviceName="MyPrinterName";
pi.pDevMode.dmSpecVersion = 1025;
pi.pDevMode.dmDriverVersion = 1024;
pi.pDevMode.dmSize = 156;
pi.pDevMode.dmDriverExtra = 0;
pi.pDevMode.dmFields = 93715;
// DM_ORIENTATION | DM_PAPERSIZE | DM_SCALE |
// DM_DEFAULTSOURCE | DM_PRINTQUALITY | DM_COLOR |
// DM_YRESOLUTION | DM_TTOPTION | DM_FORMNAME
pi.pDevMode.fmOrientation = 1; // DMORIENT_PORTRAIT
pi.pDevMode.dmPaperSize = 1; // DMPAPER_LETTER
pi.pDevMode.dmPaperLength = 2794;
pi.pDevMode.dmPaperWidth = 2159;
pi.pDevMode.dmScale = 100; // 100% (1:1)
pi.pDevMode.dmCopies = 1;
pi.pDevMode.dmDefaultSource = 15; // DMBIN_FORMSOURCE
pi.pDevMode.dmPrintQuality = 600;
pi.pDevMode.dmColor = 2; // DMCOLOR_COLOR
pi.pDevMode.dmDuplex = 0;
pi.pDevMode.dmYResolution = 600;
pi.pDevMode.dmTTOption = 3; // DMTT_SUBDEV
pi.pDevMode.dmCollate = 0;
pi.pDevMode.dmFormName = "Letter";
pi.pSepFile = "";
pi.pPrintProcessor = "WinPrint";
pi.pDatatype = "RAW";
pi.pParameters = "";
pi.pSecurityDescriptor = NULL;
pi.Attributes = PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST |
PRINTER_ATTRIBUTE_LOCAL;
AddPrinter(NULL, 2, &pi); // returns 0
GetLastError(); // returns 1003 "Cannot complete this function"

The only difference I noticed between Win32 and x64 is the driver path
(C:\WINDOWS\system32\spool\drivers\x64) and the environment string
("Windows x64" vs "Windows NT x86"). Other than those, my installer
works perfectly on Win32, but never on x64.

I've spent several days researching it, but was unable to figure it out.
AddPrinterDriverEx always suceeds, but AddPrinter fails with error 1003.
There must be something that causes this problem on the x64 platform.
This code has been working for years on Win32 with hundreds of different
machines.

I was wondering if anyone can spot something obvious, or point me to the
right direction please.

As I mentioned, installing via the INF file works fine. However, I
prefer automatic installation, because it's part of a bigger system.
Obviously, eventually I want to install my own printer driver, not
MSPLOT. I'm only using MSPLOT to make sure the problem is not with my
driver.

The Microsoft-provided INF file contains the following information:

[HP]
"Hewlett-Packard HP-GL/2 Plotter" = HPGL2PEN.PCD,
HPHewlett-Packard_HP7319,Hewlett-Packard_HP-GL/2_Plotter

[HP.NTamd64]
"Hewlett-Packard HP-GL/2 Plotter" = HPGL2PEN.PCD,
HPHewlett-Packard_HP7319,Hewlett-Packard_HP-GL/2_Plotter

When I rename these strings to my own company and product information,
it no longer works. That's probably because of the 16-bit CRC code
(7319) in the hardware ID, which I don't know how to generate for my own
product name. I've tried to recreate that CRC based on the manufacturer
and product name without success. It doesn't seem to be documented
anywhere. Anyway, the INF file is not my preferred installation method,
I would really like to get it to work with the AddPrinter call.

Thanks,
Tamas
Ads
  #2  
Old December 7th 07, 08:22 PM posted to microsoft.public.windowsxp.print_fax
Alan Morris [MSFT]
external usenet poster
 
Posts: 783
Default x64 AddPrinter error 1003

the drivers should be copied to the 3 directory

C:\WINDOWS\system32\spool\drivers\x64\3

CopyFile("driver.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dll", FALSE);
CopyFile("driver.dat",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat", FALSE);
CopyFile("driverui.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll", FALSE);


--
Alan Morris
Windows Printing Team
Search the Microsoft Knowledge Base he
http://support.microsoft.com/default.aspx?scid=fh;[ln];kbhowto

This posting is provided "AS IS" with no warranties, and confers no rights.

"Tamas Demjen" wrote in message
...
I'm porting a virtual printer driver from 32-bit to 64-bit, and am having
problems installing it.

My test system is AMD X64 X2 Dual, 1GB RAM, Windows 2003 Server SP1. Just
for the sake of troubleshooting, I've been using the MSPLOT printer driver
that comes with full source code with the Windows 2003 DDK. Everything I
say equally applies to MSPLOT and my own printer driver.

The way I normally install the printer driver on Win32 is using
GetPrinterDriverDirectory, CopyFile, AddPortEx, AddPrinterDriverEx, and
AddPrinter. The AddPrinter call fails on x64 with error 1003 "Cannot
complete this function".

I know that the printer driver is valid, because it happens with MSPLOT,
one of the DDK samples (c:\WINDDK\3790.1830\src\print\msplot\), and that's
x64-compatible. It installs fine manually, using the INF file. And yes,
it's compiled for amd64.

Here's some more specific information of what I'm trying to do:
GetPrinterDriverDirectory(...)
// returns C:\WINDOWS\system32\spool\drivers\x64

CopyFile("driver.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dll", FALSE);
CopyFile("driver.dat",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat", FALSE);
CopyFile("driverui.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll", FALSE);

DRIVER_INFO_3 driverInfo3;
memset(&driverInfo3, 0, sizeof(driverInfo3));
driverInfo3.cVersion = 3;
driverInfo3.pName = "MyPrinterName";
driverInfo3.pEnvironment = "Windows x64";
driverInfo3.pDriverPath =
"C:\\WINDOWS\\system32\spool\\drivers\\x64\\driver .dll";
driverInfo3.pDataFile =
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat";
driverInfo3.pConfigFile =
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll";
driverInfo3.pHelpFile = "";
driverInfo3.pDependentFiles = "\0";
driverInfo3.pMonitorName = NULL;
driverInfo3.pDefaultDataType = "RAW";
AddPrinterDriverEx(NULL, 6, &driverInfo3, APD_COPY_NEW_FILES); // returns
TRUE, GetLastError() 0

PRINTER_INFO_2 pi;
memset(&pi, 0, sizeof(pi));
pi.pServerName = NULL;
pi.pPrinterName = "MyPrinterName";
pi.pShareName = NULL;
pi.pPortName = "My Port:";
pi.pDriverName = "MyPrinterName";
pi.pComment = "";
pi.pLocation = "";
pi.pDevMode.dmDeviceName="MyPrinterName";
pi.pDevMode.dmSpecVersion = 1025;
pi.pDevMode.dmDriverVersion = 1024;
pi.pDevMode.dmSize = 156;
pi.pDevMode.dmDriverExtra = 0;
pi.pDevMode.dmFields = 93715;
// DM_ORIENTATION | DM_PAPERSIZE | DM_SCALE |
// DM_DEFAULTSOURCE | DM_PRINTQUALITY | DM_COLOR |
// DM_YRESOLUTION | DM_TTOPTION | DM_FORMNAME
pi.pDevMode.fmOrientation = 1; // DMORIENT_PORTRAIT
pi.pDevMode.dmPaperSize = 1; // DMPAPER_LETTER
pi.pDevMode.dmPaperLength = 2794;
pi.pDevMode.dmPaperWidth = 2159;
pi.pDevMode.dmScale = 100; // 100% (1:1)
pi.pDevMode.dmCopies = 1;
pi.pDevMode.dmDefaultSource = 15; // DMBIN_FORMSOURCE
pi.pDevMode.dmPrintQuality = 600;
pi.pDevMode.dmColor = 2; // DMCOLOR_COLOR
pi.pDevMode.dmDuplex = 0;
pi.pDevMode.dmYResolution = 600;
pi.pDevMode.dmTTOption = 3; // DMTT_SUBDEV
pi.pDevMode.dmCollate = 0;
pi.pDevMode.dmFormName = "Letter";
pi.pSepFile = "";
pi.pPrintProcessor = "WinPrint";
pi.pDatatype = "RAW";
pi.pParameters = "";
pi.pSecurityDescriptor = NULL;
pi.Attributes = PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST |
PRINTER_ATTRIBUTE_LOCAL;
AddPrinter(NULL, 2, &pi); // returns 0
GetLastError(); // returns 1003 "Cannot complete this function"

The only difference I noticed between Win32 and x64 is the driver path
(C:\WINDOWS\system32\spool\drivers\x64) and the environment string
("Windows x64" vs "Windows NT x86"). Other than those, my installer works
perfectly on Win32, but never on x64.

I've spent several days researching it, but was unable to figure it out.
AddPrinterDriverEx always suceeds, but AddPrinter fails with error 1003.
There must be something that causes this problem on the x64 platform. This
code has been working for years on Win32 with hundreds of different
machines.

I was wondering if anyone can spot something obvious, or point me to the
right direction please.

As I mentioned, installing via the INF file works fine. However, I prefer
automatic installation, because it's part of a bigger system. Obviously,
eventually I want to install my own printer driver, not MSPLOT. I'm only
using MSPLOT to make sure the problem is not with my driver.

The Microsoft-provided INF file contains the following information:

[HP]
"Hewlett-Packard HP-GL/2 Plotter" = HPGL2PEN.PCD,
HPHewlett-Packard_HP7319,Hewlett-Packard_HP-GL/2_Plotter

[HP.NTamd64]
"Hewlett-Packard HP-GL/2 Plotter" = HPGL2PEN.PCD,
HPHewlett-Packard_HP7319,Hewlett-Packard_HP-GL/2_Plotter

When I rename these strings to my own company and product information, it
no longer works. That's probably because of the 16-bit CRC code (7319) in
the hardware ID, which I don't know how to generate for my own product
name. I've tried to recreate that CRC based on the manufacturer and
product name without success. It doesn't seem to be documented anywhere.
Anyway, the INF file is not my preferred installation method, I would
really like to get it to work with the AddPrinter call.

Thanks,
Tamas



  #3  
Old December 10th 07, 05:58 PM posted to microsoft.public.windowsxp.print_fax
Tamas Demjen
external usenet poster
 
Posts: 4
Default x64 AddPrinter error 1003

Thank Alan. I actually tried that, but it didn't make any difference. In
fact, the driver itself installs properly, I never had a problem with
that. The driver is in the 3 directory after the AddPrinterDriverEx
call. AddPrinterDriverEx automatically puts it there. What really fails
consistently is AddPrinter.

I don't suspect that the printer driver itself is wrong, because it's
Microsoft's HPGL Plotter driver, and it installs via the INF file. I
wish I had some working sample code that properly installs a printer
dirver on x64.

In my previous message I sent pseudo code that didn't really compile.
Here's the actual source code that I'm using (now modified to use the
"3" directory). This is the simplest way of reproducing the problem:

#include "stdafx.h"
#include windows.h

#if defined(_UNICODE) || defined(UNICODE)
#define _FN(___FUNCTION_NAME___) ___FUNCTION_NAME___##"W"
#else
#define _FN(___FUNCTION_NAME___) ___FUNCTION_NAME___##"A"
#endif // defined(_UNICODE) || defined(UNICODE)

int _tmain(int argc, _TCHAR* argv[])
{
CopyFile(_T("c:\\Driver3\\plotter.dll"),
_T("C:\\WINDOWS\\system32\\spool\\drivers\\x64\\3\ \plotter.dll"),
FALSE);
CopyFile(_T("c:\\Driver3\\hpgl2pen.pcd"),
_T("C:\\WINDOWS\\system32\\spool\\drivers\\x64\\3\ \hpgl2pen.pcd"),
FALSE);
CopyFile(_T("c:\\Driver3\\plotui.dll"),
_T("C:\\WINDOWS\\system32\\spool\\drivers\\3\\x64\ \plotui.dll"),
FALSE);

typedef BOOL (WINAPI *type_AddPortEx)(LPCTSTR szName, DWORD dwLevel,
LPBYTE pInfo, LPCTSTR szMonitor);
HMODULE hWinspool = LoadLibrary(_T("WINSPOOL.DRV"));
type_AddPortEx AddPortEx = (type_AddPortEx)GetProcAddress(hWinspool,
_FN("AddPortEx"));
PORT_INFO_1 portInfo;
memset(&portInfo, 0, sizeof(PORT_INFO_1));
portInfo.pName = _T("MyPrinter Port");
BOOL res0 = AddPortEx(NULL, 1, (LPBYTE)&portInfo, _T("Local Port"));
// returns TRUE
FreeLibrary(hWinspool);

DRIVER_INFO_3 driverInfo3;
memset(&driverInfo3, 0, sizeof(driverInfo3));
driverInfo3.cVersion = 3;
driverInfo3.pName = _T("MyPrinterName");
driverInfo3.pEnvironment = _T("Windows x64");
driverInfo3.pDriverPath =
_T("C:\\WINDOWS\\system32\\spool\\drivers\\x64\\3\ \plotter.dll");
driverInfo3.pDataFile =
_T("C:\\WINDOWS\\system32\\spool\\drivers\\x64\\3\ \hpgl2pen.pcd");
driverInfo3.pConfigFile =
_T("C:\\WINDOWS\\system32\\spool\\drivers\\x64\\3\ \plotui.dll");
driverInfo3.pHelpFile = _T("");
driverInfo3.pDependentFiles = _T("\0");
driverInfo3.pMonitorName = NULL;
driverInfo3.pDefaultDataType = _T("RAW");
BOOL res1 = AddPrinterDriverEx(NULL, 3, (LPBYTE)&driverInfo3,
APD_COPY_NEW_FILES);
// returns TRUE, GetLastError() 0

PRINTER_INFO_2 pi;
memset(&pi, 0, sizeof(pi));
DEVMODE dm;
memset(&dm, 0, sizeof(dm));
pi.pDevMode = &dm;
pi.pServerName = NULL;
pi.pPrinterName = _T("MyPrinterName");
pi.pShareName = NULL;
pi.pPortName = _T("MyPrinter Port:");
pi.pDriverName = _T("MyPrinterName");
pi.pComment = _T("");
pi.pLocation = _T("");
_tcscpy(pi.pDevMode-dmDeviceName, _T("MyPrinterName"));
pi.pDevMode-dmSpecVersion = 1025;
pi.pDevMode-dmDriverVersion = 1024;
pi.pDevMode-dmSize = 156;
pi.pDevMode-dmDriverExtra = 0;
pi.pDevMode-dmFields =
DM_ORIENTATION | DM_PAPERSIZE | DM_SCALE |
DM_DEFAULTSOURCE | DM_PRINTQUALITY | DM_COLOR |
DM_YRESOLUTION | DM_TTOPTION | DM_FORMNAME;
pi.pDevMode-dmOrientation = 1; // DMORIENT_PORTRAIT
pi.pDevMode-dmPaperSize = 1; // DMPAPER_LETTER
pi.pDevMode-dmPaperLength = 2794;
pi.pDevMode-dmPaperWidth = 2159;
pi.pDevMode-dmScale = 100; // 100% (1:1)
pi.pDevMode-dmCopies = 1;
pi.pDevMode-dmDefaultSource = 15; // DMBIN_FORMSOURCE
pi.pDevMode-dmPrintQuality = 600;
pi.pDevMode-dmColor = 2; // DMCOLOR_COLOR
pi.pDevMode-dmDuplex = 0;
pi.pDevMode-dmYResolution = 600;
pi.pDevMode-dmTTOption = 3; // DMTT_SUBDEV
pi.pDevMode-dmCollate = 0;
_tcscpy(pi.pDevMode-dmFormName, _T("Letter"));
pi.pSepFile = _T("");
pi.pPrintProcessor = _T("WinPrint");
pi.pDatatype = _T("RAW");
pi.pParameters = _T("");
pi.pSecurityDescriptor = NULL;
pi.Attributes = PRINTER_ATTRIBUTE_DO_COMPLETE_FIRST |
PRINTER_ATTRIBUTE_LOCAL;
HANDLE hprinter = AddPrinter(NULL, 2, (LPBYTE)&pi); // returns 0
DWORD dw = GetLastError();
// returns 1003 "Cannot complete this function"

return 0;
}

Thanks,
Tamas

Alan Morris [MSFT] wrote:
the drivers should be copied to the 3 directory

C:\WINDOWS\system32\spool\drivers\x64\3

CopyFile("driver.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dll", FALSE);
CopyFile("driver.dat",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat", FALSE);
CopyFile("driverui.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll", FALSE);


  #4  
Old December 10th 07, 06:17 PM posted to microsoft.public.windowsxp.print_fax
Tamas Demjen
external usenet poster
 
Posts: 4
Default x64 AddPrinter error 1003

Hmmm... that's odd, because AddPrinterDriverEx fails if I CopyFile to
the C:\WINDOWS\system32\spool\drivers\x64\3 directory. It returns error
2 "The system cannot find the file specified". I have to CopyFile to
C:\WINDOWS\system32\spool\drivers\x64, and AddPrinterDriverEx picks the
files up from there and moves them to
C:\WINDOWS\system32\spool\drivers\x64\3 automatically. That has worked
since day 1 that way.

Regardless, AddPrinter always fails with 1003. There might be something
very wrong here.

Thanks,
Tamas

Alan Morris [MSFT] wrote:
the drivers should be copied to the 3 directory

C:\WINDOWS\system32\spool\drivers\x64\3

CopyFile("driver.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dll", FALSE);
CopyFile("driver.dat",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive r.dat", FALSE);
CopyFile("driverui.dll",
"C:\\WINDOWS\\system32\\spool\\drivers\\x64\\drive rui.dll", FALSE);


  #5  
Old October 15th 08, 09:59 PM posted to microsoft.public.windowsxp.print_fax
Marcus Schaub
external usenet poster
 
Posts: 1
Default x64 AddPrinter error 1003


I have exactly the same problem as you describe here.

I'm porting an existing printer driver to x64. Installation works fine
on Win32 with AddPort, AddPrinterDriver and AddPrinter. On Win64 (2008
in my case) AddPrinter fails with 1003 - Cannot complete this function.
I feel desperate.

Did you find a solution?

regards,
Marcus


--
Marcus Schaub
------------------------------------------------------------------------
Marcus Schaub's Profile: http://forums.techarena.in/members/marcus-schaub.htm
View this thread: http://forums.techarena.in/xp-print-fax/866576.htm

http://forums.techarena.in

  #6  
Old September 16th 09, 09:06 AM
Madalin Plastoi Madalin Plastoi is offline
Registered User
 
First recorded activity by PCbanter: Sep 2009
Posts: 1
Default

Quote:
Originally Posted by Marcus Schaub View Post
I have exactly the same problem as you describe here.

I'm porting an existing printer driver to x64. Installation works fine
on Win32 with AddPort, AddPrinterDriver and AddPrinter. On Win64 (2008
in my case) AddPrinter fails with 1003 - Cannot complete this function.
I feel desperate.

Did you find a solution?

regards,
Marcus


--
Marcus Schaub
------------------------------------------------------------------------
Marcus Schaub's Profile: http://forums.techarena.in/members/marcus-schaub.htm
View this thread: http://forums.techarena.in/xp-print-fax/866576.htm

http://forums.techarena.in
I also have the same problem with a driver.
On Win32 it installs ok, but on Win64 installation fails - AddPrinter with 1003 error code.

I see that your posts are old. Did you find a solution for this?

Thank you!
 




Thread Tools
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

vB code is On
Smilies are On
[IMG] code is Off
HTML code is Off






All times are GMT +1. The time now is 01:40 PM.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Copyright ©2004-2024 PCbanter.
The comments are property of their posters.