如何获取打印机的网络路径(\\ COMPUTER \ PRINTERNAME)

时间:2010-02-12 15:47:31

标签: c++

如何从默认打印机窗口c ++获取打印机的网络路径(\ COMPUTER \ PRINTERNAME)。

1 个答案:

答案 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 ;
}