I’m a Javascript developer, so go easy on me! I am trying to write just a patch of C++ to enable printing on a framework. I’m compiling with Unicode, and based on my research, that is what is messing me up.
I think this is a relatively simple thing that I’m over complicating. The application has a std::string that contains the current printer name. The script first checks if it is unset (if it is it utilizes GetDefaultPrinter which outputs a LPTSTR). Finally, the script takes either than std::string or the LPTSTR and converts it to a LPCTSTR for CreateDC.
Here is my code:
std::string PrinterName = window->getPrinter();
LPDWORD lPrinterNameLength;
LPWSTR szPrinterName;
LPCTSTR PrinterHandle;
if (PrinterName == "unset") {
GetDefaultPrinter( szPrinterName, &lPrinterNameLength );
PrinterHandle = szPrinterName; //Note sure the best way to convert here
} else {
PrinterHandle = PrinterName.c_str();
}
HDC hdc = CreateDC( L"WINSPOOL\0", PrinterHandle, NULL, NULL);
When compiling, I only get conversions errors. Such as
Cannot convert parameter 2 from LPDWORD * to LPDWORD (GetDefaultPrinter)
and
Cannot convert from ‘const char *’ to ‘LPCTSTR’ (On the PrinterHandle = PrinterName.c_str() line)
I’ve done quite a bit of SO research on this, but haven’t come up with a concrete solution.
Any help is greatly appreciated!
Even if you’re compiled for “Unicode” (wide characters strings), you can call the “ANSI” (narrow characters strings) versions of the API functions. Windows will do the conversions for you and call the wide character version under the covers.
For example, for most Windows APIs like
CreateDC, there isn’t actually a function with that name. Instead, there’s a macro namedCreateDCthat expands to eitherCreateDCAorCreateDCW, which are the actual function names. When you’re compiled for “Unicode”, the macros expand to the-Wversions (which are the native ones in all modern versions of the OS. Nothing prevents you from explicitly calling either version, regardless of whether you’re compiled for Unicode. In most cases, the-Aversion will simply convert the narrow strings to wide ones for you and then call the corresponding-Wversion. (There are some caveats here related to creating windows, but I don’t think they apply to DCs.)