【问题标题】:How can i get the printer's network path (\\COMPUTER\PRINTERNAME)如何获取打印机的网络路径 (\\COMPUTER\PRINTERNAME)
【发布时间】:2010-02-13 00:27:25
【问题描述】:

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

【问题讨论】:

  • 打印机没有网络路径怎么办?

标签: c++


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-04-26
    • 2011-06-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多