So, I found the solution myself. There should be a better and easier way, but it works well.
When installing the driver, also copy the necessary architecture files to other architectures. x86 driver for xool spooler driver dir, x64-x64 buffer queue manager driver, etc.
Then, before calling AddPrinterDriver and AddPrinter, you must add several registry values for each other architecture that you want to support. Then call AddPrinterDriver and AddPrinter only for the underlying os architecture in which you install your driver.
Registry values must be added to
SYSTEM \ CurrentControlSet \ Control \ Print \ Environments \ {TARGET_ENVIROMENT} \ Drivers \ Version-3 \ {NAME_OF_YOUR_DRIVER}
{TARGET_ENVIROMENT} , , . "Windows NT x86"; "Windows x64"; "Windows IA64" {NAME_OF_YOUR_DRIVER} drivername, AddPrinterDriver. , , , AddPrinterDriver . . AddPrinterDriver AddPrinter .
Win32 x86 x64 x64 ( ):
DWORD uSize;
BYTE driver_dir_x86[MAX_PATH];
BYTE driver_dir_x64[MAX_PATH];
GetPrinterDriverDirectory(NULL,"Windows NT x86",1,driver_dir_x86,MAX_PATH,&uSize);
GetPrinterDriverDirectory(NULL,"Windows x64",1,driver_dir_x64,MAX_PATH,&uSize);
CopyFile(".\x86\printer_driver.dll",driver_dir_x86);
CopyFile(".\x86\PRINTER.PPD",driver_dir_x86);
CopyFile(".\x86\PRINTERUI.DLL",driver_dir_x86);
CopyFile(".\x86\PRINTER.HLP",driver_dir_x86);
CopyFile(".\x64\printer_driver.dll",driver_dir_x64);
CopyFile(".\x86\PRINTER.PPD",driver_dir_x64);
CopyFile(".\x86\PRINTERUI.DLL",driver_dir_x64);
CopyFile(".\x86\PRINTER.HLP",driver_dir_x64);
RegOpenKeyEx(HKEY_LOCAL_MACHINE, "SYSTEM\\CurrentControlSet\\Control\\Print\\Environments\\Windows NT x86\\Drivers\\Version-3\\", 0, KEY_ALL_ACCESS, &hkey);
RegCreateKey(hkey, "My_Printer_Drivername", &hsubkey); {
RegSetValueEx(hsubkey, "Dependent Files", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "Previous Names", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "ColorProfiles", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "CoreDependencies", 0, REG_MULTI_SZ, (BYTE*)"", lstrlen("")+1);
DWORD Val = 3;
RegSetValueEx(hsubkey, "Version", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
Val = 0;
RegSetValueEx(hsubkey, "TempDir", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
Val = 2;
RegSetValueEx(hsubkey, "Attributes", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
Val = 0;
RegSetValueEx(hsubkey, "PrinterDriverAttributes", 0, REG_DWORD, (BYTE*)&Val, sizeof(DWORD));
RegSetValueEx(hsubkey, "Configuration File", 0, REG_SZ, (BYTE*)"PRINTERUI.DLL", lstrlen("PRINTERUI.DLL")+1);
RegSetValueEx(hsubkey, "Data File", 0, REG_SZ, (BYTE*)"PRINTER.PPD", lstrlen("PRINTER.PPD")+1);
RegSetValueEx(hsubkey, "Driver", 0, REG_SZ, (BYTE*)"printer_driver.dll", lstrlen("printer_driver.dll")+1);
RegSetValueEx(hsubkey, "Help File", 0, REG_SZ, (BYTE*)"PRINTER.HLP", lstrlen("PRINTER.HLP")+1);
RegSetValueEx(hsubkey, "Monitor", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "Datatype", 0, REG_SZ, (BYTE*)"RAW", lstrlen("RAW")+1);
RegSetValueEx(hsubkey, "Manufacturer", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "OEM URL", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "HardwareID", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "Provider", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "Print Processor", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "VendorSetup", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "InfPath", 0, REG_SZ, (BYTE*)"", lstrlen("")+1);
RegSetValueEx(hsubkey, "DriverDate", 0, REG_SZ, (BYTE*)"01/01/2010", lstrlen("01/01/2010")+1);
RegSetValueEx(hsubkey, "DriverVersion", 0, REG_SZ, (BYTE*)"1.0.0.0", lstrlen("1.0.0.0")+1);
RegSetValueEx(hsubkey, "MinInboxDriverVerDate", 0, REG_SZ, (BYTE*)"01/01/2010", lstrlen("01/01/2010")+1);
RegSetValueEx(hsubkey, "MinInboxDriverVerVersion", 0, REG_SZ, (BYTE*)"1.0.0.0", lstrlen("1.0.0.0")+1);
RegCloseKey(hsubkey);
RegCloseKey(hkey);
DRIVER_INFO_3 di3;
ZeroMemory(&di3, sizeof(DRIVER_INFO_3));
di3.cVersion = 0x03;
di3.pConfigFile = "PRINTERUI.DLL";
di3.pDataFile = "PRINTER.PPD";
di3.pDependentFiles = "";
di3.pDriverPath = "printer_driver.dll";
di3.pEnvironment = "Windows x64";
di3.pHelpFile = "PRINTER.HLP";
di3.pMonitorName = NULL;
di3.pName = "My_Printer_Drivername";
di3.pDefaultDataType = TEXT("RAW");
AddPrinterDriver(NULL, 3, (LPBYTE)&di3);