0

我正在尝试访问PRINTER_INFO_2结构的友好名称属性。但我根本不知道如何在 C++ 中做到这一点。

所以下面的代码以十六进制返回名称...

int _tmain(int argc, _TCHAR* argv[])
{
    DWORD dwNeeded = 0, dwPrintersR = 0, Level = 2;
    PRINTER_INFO_2* prninfo=NULL;
    int retValue = 0;

    //Find required buffer size
    EnumPrinters( PRINTER_ENUM_NAME, NULL, Level, NULL, 0, &dwNeeded, &dwPrintersR );


    prninfo = (PRINTER_INFO_2*) GlobalAlloc(GPTR,dwNeeded);
    EnumPrinters( PRINTER_ENUM_NAME, NULL, Level, (LPBYTE) prninfo, dwNeeded, &dwNeeded, &dwPrintersR );
    cout << "# of printers:" << dwPrintersR << "\n";
    for(int i = 0; i<dwPrintersR; i++){
        cout << "Printer Name: " << prninfo[i].pPrinterName << "\n";
    }
    _getch();
    return 0;
}

我想使用 PRINTER_ATTRIBUTE_FRIENDLY_NAME,但我不知道该怎么做。

我是 C++ 和编译语言的新手。非常感谢你。

4

2 回答 2

0

该代码正在工作,除了它实际尝试将名称打印到控制台窗口的位置。

看来您正在为 Unicode 编译,因此打印机名称是一个宽字符串 ( whcar_t *)。没有重载std::ostream::operator<<(wchar_t*),所以你最终得到的是指针的值而不是字符串。

您需要将宽字符串转换为“ANSI”字符串,编译为 ANSI 而不是 Unicode,或者使用处理宽字符串的函数输出名称。例如,您可以将该cout行替换为:

MessageBox(NULL, prninfo[i].pPrinterName, TEXT("Printer Name"), MB_OK);
于 2013-05-01T20:31:23.530 回答
0

或者干脆替换这个

cout << "打印机数量:" << dwPrintersR << "\n";

有了这个

wcout << L"打印机名称:" << prninfo[i].pPrinterName << L"\n";

经测试。有效。

于 2017-04-04T14:12:27.220 回答