如何从默认打印机窗口c ++获取打印机的网络路径(\ COMPUTER \ PRINTERNAME)。
答案 0 :(得分:0)
在this forum post找到的这段代码可能会解决问题:
当然,您肯定需要Windows SDK。您可能还需要与线程中提到的winspool.lib库链接,虽然看起来这个代码从注册表中检索名称,所以我的猜测是你没有。如果您使用此代码,请评论您修复的任何怪癖,或者您是否需要与winspool.lib链接。
此外,您可能需要查看this other related Stack Overflow post。如果我是你,我会首先使用GetDefaultPrinter
函数,如果它返回打印机名称长度为0,则默认使用下面的代码。
#ifdef UNICODE
#define GETDEFAULTPRINTER "GetDefaultPrinterW"
#else
#define GETDEFAULTPRINTER "GetDefaultPrinterA"
#endif
CString GetDefaultPrinterName()
{
CString strPrinterName = TEXT("") ;
OSVERSIONINFO osv;
// --- Get the operationg system versin info ---
osv.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx( &osv ) ;
BOOL bRet = FALSE ;
// If Windows 95 or 98, use EnumPrinters.
if (osv.dwPlatformId == VER_PLATFORM_WIN32_WINDOWS)
{
// The first EnumPrinters() tells you how big our buffer must
// be to hold ALL of PRINTER_INFO_2. Note that this will
// typically return FALSE. This only means that the buffer (the 4th
// parameter) was not filled in. You do not want it filled in here.
DWORD dwNeeded = 0 , dwReturned = 0 ;
SetLastError(0);
bRet = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, NULL, 0, &dwNeeded, &dwReturned);
if ((GetLastError() != ERROR_INSUFFICIENT_BUFFER) || (dwNeeded == 0))
return CString("") ;
PRINTER_INFO_2 * ppi2 = reinterpret_cast<PRINTER_INFO_2 *>(new char[dwNeeded] ) ;
if( !ppi2 )
return CString("") ;
// The second EnumPrinters() will fill in all the current information.
bRet = EnumPrinters(PRINTER_ENUM_DEFAULT, NULL, 2, (LPBYTE)ppi2, dwNeeded, &dwNeeded, &dwReturned);
if( !bRet )
{
char * pTemp = reinterpret_cast<char *>( ppi2 ) ;
delete []pTemp ;
return CString("");
}
// --- Get the printer name ---
strPrinterName = ppi2->pPrinterName ;
// --- Free memory ---
char * pTemp = reinterpret_cast<char *>( ppi2 ) ;
delete []pTemp ;
}
// If Windows NT, use the GetDefaultPrinter API for Windows 2000,
// or GetProfileString for version 4.0 and earlier.
else if (osv.dwPlatformId == VER_PLATFORM_WIN32_NT)
{
// Windows 2000 or later (use explicit call)
// --- Call GetDefaultPrinter() to get the printer name ---
if (osv.dwMajorVersion >= 5)
{
// --- Load library winspool.drv ---
HMODULE hSpoolDrv = LoadLibrary("winspool.drv") ;
if( !hSpoolDrv )
return CString("");
// --- function type definition ---
typedef BOOL (FAR PASCAL *FNGETPRINTER)(LPTSTR ,LPDWORD );
FNGETPRINTER fnGetPrinter = (FNGETPRINTER)GetProcAddress( hSpoolDrv, GETDEFAULTPRINTER ) ;
if( fnGetPrinter )
{
LPTSTR szPrinterName[MAX_PATH] ;
DWORD nLen = MAX_PATH ;
bRet = fnGetPrinter((LPTSTR)szPrinterName,&nLen);
// --- Function call succeeds, then set the printer name ---
if( bRet )
strPrinterName = (char *)szPrinterName ;
}
FreeLibrary( hSpoolDrv ) ;
}
else// --- NT4.0 or earlier ---
{
// Retrieve the default string from Win.ini (the registry).
// String will be in form "printername,drivername,portname".
TCHAR szBuffer[MAX_PATH] ;
// --- HKEY_CURRENT_USER\Software\Microsoft\Windows NT\CurrentVersion\Windows\Version ---
if (GetProfileString("windows", "device", ",,,", szBuffer, MAX_PATH ) <= 0)
return CString("");
// Printer name precedes first "," character.
strtok(szBuffer, ",");
if( lstrlen(szBuffer) <= 0 )
return CString("") ;
// --- Set the printer name ---
strPrinterName = szBuffer ;
}
}
return strPrinterName ;
}