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