0
如何从默认打印机窗口C++获取打印机的网络路径(\ COMPUTER \ PRINTERNAME)。如何获取打印机的网络路径(\ COMPUTER PRINTERNAME)
如何从默认打印机窗口C++获取打印机的网络路径(\ COMPUTER \ PRINTERNAME)。如何获取打印机的网络路径(\ COMPUTER PRINTERNAME)
在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 ;
}
的打印机名称的长度,如果什么打印机没有网络路径? – 2010-02-12 16:26:21